导入Python模块不在路径上

9 浏览
0 Comments

导入Python模块不在路径上

我有一个名为foo的模块,其中包含util.py和bar.py。我想在IDLE或Python会话中导入它。我该怎么做?

我在文档中找不到关于如何导入不在当前目录或默认Python路径中的模块的说明。

在尝试了import "<完整路径>/foo/util.py"from "<完整路径>" import util之后,

我最接近的结果是

import imp
imp.load_source('foo.util','C:/.../dir/dir2/foo')

这在Windows 7上给我权限被拒绝的错误。

0
0 Comments

一种方法是简单地修改你的路径:

import sys
sys.path.append('C:/full/path')
from foo import util,bar

注意,这要求foo是一个Python包,即包含一个__init__.py文件。如果你不想修改sys.path,你也可以修改PYTHONPATH环境变量或者在系统上安装该模块。要注意的是,这意味着该目录中的其他目录或.py文件可能会被错误加载。

因此,你可能希望使用imp.load_source。它需要文件名而不是目录(对于当前用户有读取权限的文件):

import imp
util = imp.load_source('util', 'C:/full/path/foo/util.py')

它可以工作,但是现在当尝试使用util.method时,通过method使用它会提示'method'未定义。但是我可以通过util.method使用它。为什么?

因为你没有定义method,只是"在util中的method"。如果你想要,你可以定义method = util.method

注意,除非你只是在shell中进行hack,from foo import *是糟糕的编码。

谢谢。我正在使用from foo import util,而不是from foo import *。所以不用担心;)

嗯,这使得util在你的命名空间中可用。为什么你期望util.method在名称method下可用呢?那意味着你必须确保bar中没有另一个method,从而破坏了模块系统的整体目标,即不必担心名称冲突。

改正为package__init__.py是必需的。观察mkdir foo; touch foo/util.py; python -c 'from foo import util'touch foo/__init__.py; python -c 'from foo import util'

-1因为将Python路径追加到系统路径是一个不好的解决方法。它可以工作,但是它严格比imp.load_source更糟糕,因为用户可能不想修改任何系统路径,或者可能在无法修改系统路径的计算机上工作。这实际上是Python中最烦人的"特性"之一,而Python本身是一种优雅的语言。很傻,你不能只给import一个字符串来命名另一个.py文件的路径。而且鉴于不能这样做,使用imp来保护不改变系统路径是绝对更好的。

Python文档明确提到了sys.path。如果用户不能修改sys.path,那么阻止imp模块的可能性非常大(请注意,Python的sys.path与系统的PATH无关)。就个人而言,我认为通过名称而不是文件名加载模块并不傻;它允许在系统范围内安装Python包(例如,在2.5上,你可能希望使用你的另一个json模块)。添加了一个警告说明。

嗯,是的,要从包中导入,你确实需要__init__.py,虽然如果在没有它的情况下将<full path>/foo添加到sys.path,那么import utilimport bar都能工作。(将投票更改为+1)

0
0 Comments

在Python中,我们可以使用import语句来导入模块,从而使用模块中的功能。但有时候我们会遇到一个问题,即"Import python module NOT on path",即导入的模块不在Python的搜索路径中。那么为什么会出现这个问题,以及如何解决呢?

导致这个问题出现的原因是,Python在导入模块时会在一系列预定义的路径中搜索要导入的模块。如果模块不在这些路径中,就会导致"Import python module NOT on path"错误的出现。

要解决这个问题,有两种方法可以尝试。

第一种方法是通过自定义模块搜索路径来解决。我们可以使用PYTHONPATH环境变量来指定额外的模块搜索路径,或者手动修改sys.path列表。PYTHONPATH环境变量是一个包含多个目录路径的字符串,Python会在这些路径中搜索要导入的模块。我们可以将需要导入的模块所在的路径添加到PYTHONPATH环境变量中,或者直接将路径添加到sys.path列表中。

下面是使用PYTHONPATH环境变量的示例代码:

import os
import sys
# 添加要导入模块的路径到PYTHONPATH环境变量中
os.environ['PYTHONPATH'] = '/path/to/module'
# 重新加载sys模块,以便更新sys.path列表
sys.path.append('/path/to/module')

第二种方法是直接在代码中指定要导入的模块的路径。我们可以使用绝对路径或相对路径来指定模块的位置。

下面是直接指定模块路径的示例代码:

import sys
# 添加要导入模块的路径到sys.path列表中
sys.path.append('/path/to/module')
# 导入模块
import module

通过以上两种方法,我们可以解决"Import python module NOT on path"的问题,成功导入不在Python搜索路径中的模块。

0
0 Comments

在这段对话中,提到了一个问题: "Import python module NOT on path"。下面是对这个问题出现的原因和解决方法的整理。

问题的原因是因为在Python中,不能直接使用import语句导入不在系统路径中的模块。虽然可以通过添加路径到sys.path来解决这个问题,但这被认为是一个不好的解决方法。因为这样做会修改系统路径,可能会引起其他问题,而且在某些情况下以及在某些计算机上,用户可能无法修改系统路径。因此,这是Python中最令人烦恼的一个问题之一。

解决这个问题的方法是使用imp.load_source函数。这个函数可以用来动态加载Python源文件,并返回一个代表该模块的模块对象。通过使用imp.load_source函数,可以避免修改系统路径,从而更加安全和可靠地导入不在系统路径中的模块。

然而,需要注意的是,从Python 3.3开始,imp.load_source函数已经被弃用了。因此,在新版本的Python中,需要使用其他方法来导入不在系统路径中的模块。在这个对话中,某些情况下了一个解决方法:在导入完模块后,使用sys.path.pop()来移除刚刚添加的路径,以避免影响其他导入操作。此外,还提到了另一个帖子,该帖子提供了针对新版本Python的解决方案和更改。

总之,解决"Import python module NOT on path"问题的方法是使用imp.load_source函数来导入不在系统路径中的模块。对于新版本的Python,可以使用其他方法来实现相同的功能。通过避免修改系统路径,可以更加安全和可靠地导入模块。

0