How to import .py file from another directory?
我有这个文件结构(目录和箭头文件之后):
1 2
| model -> py_file.py
report -> other_py_file.py |
主__init__.py:
1 2
| import model
import report |
模型目录:
报告目录:
现在在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 4
| import sys
sys.path.insert(0, 'path/to/your/py_file')
import py_file |
这是迄今为止最简单的方法。
- 是的,这是一种简单的方法,例如,从与另一个库具有相同文件名的文件夹导入时可能会导致问题。不管怎么说,在手术中是这样的,所以我想这不会伤害到…
- @torxed我在开始时故意插入路径,以便首先搜索自定义路径以处理名称冲突,这样就不会有问题。
Python 3:
1 2 3 4 5 6
| import 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 4
| import 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,整个包将被导入。