Python中import语句的范围是什么

时间:2014-01-04 10:04:26

标签: python

我对Python中import语句的范围有不同的答案。我对Stackoverflow进行了一些研究,看看有关该主题的内容。因此,如果有人想从当前工作目录导入python模块,扩展名为.py的文件,则应该没有问题。但是,如果有人想从不同的目录导入.py文件,那么我的视图中有两个相互矛盾的答案(可能是因为我缺乏完整的理解,但我正在努力理解它):

首先,这个回答“Importing files from different folder in Python”表示我们无法从python中的不同文件夹或目录导入文件。

其次,这个答案是“How to import a module given the full path?”,表示我们可以。

有人可以向我解释有什么区别吗?

4 个答案:

答案 0 :(得分:3)

粗略地说,第一个例子说你不能使用import语句从磁盘上的指定位置导入。第二个示例表明,您可以使用imp模块(提供对导入系统内部的访问)来实现类似的效果。所以你不能“真正”导入这样一个模块(在某种意义上你不能使用import来做),但是你可以使用imp模块来“使它工作”。

因此,如果你的问题是关于import 声明,那么不,你不能(没有黑客,见下文);如果你的问题只是“加载模块”(不一定使用import声明),那么你可以。这有点像说“你能解锁这扇门吗?不,因为你没有钥匙。你可以打开这扇门吗?是的,把它砸到一把大锤。“

另外,请注意,即使第一个示例确实提供了一种方法,它只是一个丑陋的黑客。

在实践中,真正的问题是为什么你觉得你需要这样做。它很少是必要的,通常意味着你正在创建一个不必要的复杂的库结构。

答案 1 :(得分:3)

在Python中导入非常简单:

  1. 导入只能通过引用模块(而不是路径)
  2. 来完成
  3. Python按以下顺序搜索可导入的内容:
    1. 从执行脚本的目录开始。
    2. 来自PYTHONPATH环境变量中的目录(如果已设置)。
    3. 从系统范围的Python安装的模块目录。
  4. 它需要这三件事并构建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()