如何从另一个目录导入 .py 文件? [复制]

Posted

技术标签:

【中文标题】如何从另一个目录导入 .py 文件? [复制]【英文标题】:How to import .py file from another directory? [duplicate] 【发布时间】:2014-05-22 05:59:56 【问题描述】:

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

model -> py_file.py 
report -> other_py_file.py

__init__.py:

import model
import report

模型目录:

import py_file

报告目录:

import 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 使用您提供的链接找到了方法。我需要使用从应用程序文件夹名称导入,例如:from my_app.model import py_file。我尝试了类似from addons.my_app.model import py_file 的东西。当这不起作用时,我认为我需要做其他事情并跳过仅从应用目录导入的部分。 请查看下面的解决方案。我认为它更适合您的编程模型。 @Torxed 我认为更好的解决方案是仅使用链接中提供的答案之一中的特定路径,因为主要是我不需要以我现在需要的方式导入许多文件。 我的答案使用特定(绝对)路径,并且可以与 os.walk() 结合使用,例如,如果您想动态导入内容,或者只是创建一个 def superimport(name, path): 并为您想要的每个模块调用它导入。只是一个想法。 【参考方案1】:

Python3:

import importlib.machinery

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

handle.mainFunction(parameter)

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

在Python3中也有更正常的导入python模块的方式,

import importlib
module = importlib.load_module('folder.filename')
module.function()

感谢Sebastian 为 Python2 提供了类似的答案:

import imp

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

【讨论】:

这不是太复杂了吗? @AlexThornton 不是真的,因为用户希望将 python 文件导入项目范围之外,我个人认为最好使用绝对路径来导入内容,而不是附加到全局导入范围。我的也更容错,我认为这是一件好事:) @AlexThornton 显然这不是完全白痴证明,但理论上您可以导入 /home/time.py 而无需替换捆绑的 time 库。假设 OP 没有预先添加 sys.path,这将确保您导入正确的库,无论您如何操作,您提供的路径实际上都是导入的模块。您还可以自定义命名空间,如果使用传统的 import ...,则无法自定义命名空间。更重要的是,这将变成一场关于哪种解决方案最好的火焰之战,我不打算推​​广,这是一个品味问题,就是这样:) @AlexThornton 澄清一下,您的解决方案还不错,而且确实有效。再说一次,你更喜欢哪种风格是一种品味,因为最终结果是一样的。 我需要单独导入每个文件吗?如何从一个目录导入多个文件?【参考方案2】:

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

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

import py_file

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

【讨论】:

是的,这是一种简单的方法,例如,从与另一个库具有相同文件名的文件夹中导入时可能会导致问题。尽管如此,在 OP 中还是会出现这种情况,所以我想这不会造成伤害...... @Torxed 我故意在开头插入了路径,以便首先搜索自定义路径以处理名称冲突,这样就不会有问题了。 如果您的 PROD 应用程序有不同的路径怎么办?这可能适用于您的本地,但是如何使文件导入在所有机器上都有效,而无需设置硬文件路径?

以上是关于如何从另一个目录导入 .py 文件? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

从另一个目录导入的Python失败

如何将 python 函数从另一个文件导入 django 视图

如何从python中的其他目录导入模块? [复制]

从另一个位置导入文件 - python

Discord.py 如何从另一个文件运行代码?

Python 3模块从另一个文件夹导入错误[重复]