导入Python模块不在路径上
一种方法是简单地修改你的路径:
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 util
和import bar
都能工作。(将投票更改为+1)
在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搜索路径中的模块。
在这段对话中,提到了一个问题: "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,可以使用其他方法来实现相同的功能。通过避免修改系统路径,可以更加安全和可靠地导入模块。