python导入py文件-关于python:如何从另一个目录导入.py文件?

本问题已经有最佳答案,请猛点这里访问。

我有这个文件结构(目录和箭头文件之后):

1

2model -> py_file.py

report -> other_py_file.py

主__init__.py:

1

2import model

import report

模型目录:

1import py_file

报告目录:

1import other_py_file

现在在other_py_file中,我想导入py_file,但我尝试过的任何一次都会出错,因为没有这样的模块。

我试过这个:from model import py_file

然后:import py_file

看起来这两个文件夹没有看到对方。从其他目录导入文件的方法是什么?我需要在init.py文件中指定一些额外的导入吗?

不能在文件夹结构中向后导入,您的结构是从根目录使用的,执行import report,这将导入other_py_file。做import ../model是行不通的。

@Torxed找到了使用您提供的链接的方法。我需要使用import-from-app文件夹名,比如:from my_app.model import py_file。我也尝试过类似的东西,比如from addons.my_app.model import py_file。当这不起作用时,我认为我需要做些别的事情,跳过了从app目录导入的部分。

请检查下面的解决方案。我认为它更适合你的编程模式。

@Torrex我认为更好的解决方案是使用特定的路径,就像在链接中提供的答案之一一样,因为我现在不需要以我需要的方式导入许多文件。

我的答案使用特定的(绝对的)路径,可以与os.walk()结合使用,例如,如果你想动态地导入东西,或者只是创建一个def superimport(name, path):并为你想要导入的每个模块调用它。只是一个想法。

"标记为重复"("如何在python中进行相对导入?")这不是这个问题的副本,因为另一个假设相对进口与"任何"目录(例如,/tmp或~/temp)。因此,请参见stackoverflow.com/questions/67631/…

您可以在运行时添加到系统路径:

1

2

3

4import sys

sys.path.insert(0, 'path/to/your/py_file')

import py_file

这是迄今为止最简单的方法。

是的,这是一种简单的方法,例如,从与另一个库具有相同文件名的文件夹导入时可能会导致问题。不管怎么说,在手术中是这样的,所以我想这不会伤害到…

@torxed我在开始时故意插入路径,以便首先搜索自定义路径以处理名称冲突,这样就不会有问题。

Python 3:

1

2

3

4

5

6import importlib.machinery

loader = importlib.machinery.SourceFileLoader('report', '/full/path/report/other_py_file.py')

handle = loader.load_module('report')

handle.mainFunction(parameter)

这个方法可以用于导入文件夹结构中您想要的任何方式(向后、向前并不重要,我使用绝对路径只是为了确保)。

感谢塞巴斯蒂安为Python2提供了类似的答案:

1

2

3

4import imp

foo = imp.load_source('module.name', '/path/to/file.py')

foo.MyClass()

这不是太复杂了吗?

@Alexthornton不是这样的,因为用户想从项目范围中导入python文件,我个人认为最好使用绝对路径来导入,而不是附加到全局导入范围中。我的也更能容忍错误,我认为这是一件好事:)

@Alexthornton显然不是完全的白痴证明,但是理论上你可以导入/home/time.py,而不需要替换捆绑的time库。假设操作没有预先准备好cx1(2),这将确保您导入正确的库,无论您如何操作,您提供的路径都将有效地导入模块。您还可以自定义名称空间,如果使用传统的import ...,则无法自定义名称空间。更重要的是,这将变成一场火焰大战,在这场战争中,哪种解决方案是最好的,哪种是我不打算推广的,这是一个品味问题,就是这样的:)

@亚历克桑顿澄清说,你的解决方案不错,而且确实有效。同样,这是一种品味,你喜欢哪种风格,而不是另一种,因为最终的结果是一样的。

我需要单独导入每个文件吗?如何从一个目录导入多个文件?

我明白了:如果我指定__init__.py,整个包将被导入。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值