我对Python中import语句的范围有不同的答案。我对Stackoverflow进行了一些研究,看看有关该主题的内容。因此,如果有人想从当前工作目录导入python模块,扩展名为.py的文件,则应该没有问题。但是,如果有人想从不同的目录导入.py文件,那么我的视图中有两个相互矛盾的答案(可能是因为我缺乏完整的理解,但我正在努力理解它):
首先,这个回答“Importing files from different folder in Python”表示我们无法从python中的不同文件夹或目录导入文件。
其次,这个答案是“How to import a module given the full path?”,表示我们可以。
有人可以向我解释有什么区别吗?
答案 0 :(得分:3)
粗略地说,第一个例子说你不能使用import
语句从磁盘上的指定位置导入。第二个示例表明,您可以使用imp
模块(提供对导入系统内部的访问)来实现类似的效果。所以你不能“真正”导入这样一个模块(在某种意义上你不能使用import
来做),但是你可以使用imp
模块来“使它工作”。
因此,如果你的问题是关于import
声明,那么不,你不能(没有黑客,见下文);如果你的问题只是“加载模块”(不一定使用import
声明),那么你可以。这有点像说“你能解锁这扇门吗?不,因为你没有钥匙。你可以打开这扇门吗?是的,把它砸到一把大锤。“
另外,请注意,即使第一个示例确实提供了一种方法,它只是一个丑陋的黑客。
在实践中,真正的问题是为什么你觉得你需要这样做。它很少是必要的,通常意味着你正在创建一个不必要的复杂的库结构。
答案 1 :(得分:3)
在Python中导入非常简单:
PYTHONPATH
环境变量中的目录(如果已设置)。它需要这三件事并构建sys.path
列表并按列出的顺序搜索它。这有一些基本问题。例如,如果您有一个包含以下文件的目录:
foo.py
math.py
在foo.py
中,如果您说import math
,它将从math.py
导入内容,而不是从Python附带的全局math
库导入内容。这是因为首先搜索当前目录中的模块。
要从文件系统路径导入和使用模块,该路径不在Python搜索的三个位置,您需要在执行任何导入之前将其添加到sys.path
变量:
import sys
sys.path.insert(0, '/some/directory/')
from somemodule import something
答案 2 :(得分:2)
两个答案都是正确的。第一个使用直接import
语句,实际上,您无法从那个方向导入另一个文件夹。
第一个将路径附加到sys.path
,这是导入模块时python将搜索的目录列表。第二个不使用import
语句,而是使用imp.load_source
,它的工作方式不同。
您想要的通常是将所有内容放在同一个文件中,或者在更高的文件夹层次结构中创建一个导入所有所需文件的脚本。
答案 3 :(得分:0)
明白这一点:
导入文件时,Python只搜索当前目录, 运行入口点脚本的目录,和 sys.path,包括软件包安装等位置 目录
:引自Importing files from different folder in Python
现在让我们说你有文件:
I) application/app/folder/file.py
II) application/app2/some_folder/some_file.py
您希望将some_file.py中的函数导入file.py.执行from application.app.folder.file import func_name
时,python会尝试解析路径application.app.folder.file
。它搜索当前目录中是否存在名为application
的包/模块,对于file.py是application/app/folder/
,在sys.path
中是否有目录路径;并且python无法在任何标准搜索路径中找到application
。所以默认情况下,你不能从不在python路径中的其他文件夹导入路径,但是你可以告诉python你的自定义搜索路径。您可以通过将路径添加到python路径(sys.path
)
import sys
sys.path.insert(0, 'application/app2/some_folder')
import some_file
如果要导入您知道绝对/完整路径的文件(如How to import a module given the full path?中所示),则执行
import imp
foo = imp.load_source('module.name', '/path/to/file.py')
foo.MyClass()