Mic*_*ton 37 python pythonpath
我最近遇到了python ImportError的问题,在我的本地计算机上运行但在CI服务器上找不到该模块.我通过交换解决了这个问题,sys.path.append(path)在我的脚本sys.path.insert(0, path)哪里path是字符串模块的位置.
由于这是我的模块而不是已安装的软件包(相关问题),为什么路径的顺序可以解决这个问题?
Ana*_*mar 26
因为python从sys.path列表中的第一个目录开始按顺序检查目录,直到找到.py它正在查找的文件.
理想情况下,当前目录或脚本目录是第一个始终是列表中的第一个元素,除非您像修改它一样修改它.从文档 -
在程序启动时初始化时,此列表的第一项path [0]是包含用于调用Python解释器的脚本的目录.如果脚本目录不可用(例如,如果以交互方式调用解释器或者从标准输入读取脚本),path [0]是空字符串,它指示Python首先搜索当前目录中的模块.请注意,在作为PYTHONPATH结果插入的条目之前插入了脚本目录.
因此,最有可能的是,您.py在当前目录(运行脚本的位置)中有一个与您尝试导入的模块同名的文件.
另外,有关ImportErrors的注意事项,可以说导入错误说 -
ImportError: No module named main- 这并不意味着main.py被覆盖,如果被覆盖则不会,我们就不会有尝试阅读它的问题.它上面的一些模块被覆盖了.py或其他一些文件.
示例 -
我的目录结构看起来像 -
- test
- shared
- __init__.py
- phtest.py
- testmain.py
Run Code Online (Sandbox Code Playgroud)
现在testmain.py,我打电话from shared import phtest,它运作正常.
现在让我说我在test目录`中引入了一个shared.py ,例如 -
- test
- shared
- __init__.py
- phtest.py
- testmain.py
- shared.py
Run Code Online (Sandbox Code Playgroud)
现在当我尝试做from shared import phtest的时候testmain.py,我会得到错误 -
ImportError: cannot import name 'phtest'
Run Code Online (Sandbox Code Playgroud)
如您所见,导致问题的文件shared.py不是phtest.py.
her*_*rin 26
我是Python的初学者,我发现Anand的答案非常好但对我来说很复杂,所以我尝试重新制定:
1)insert和append方法不是特定的,sys.path并且在其他语言中它们将项添加到列表或数组中,并且:
*append(item)添加item到列表的末尾,
*insert(n, item)插入列表item中的第n个位置(0在开头,1在第一个元素等...).
2)正如Anand所说,python按路径的顺序搜索路径的每个目录中的导入文件,因此:
*如果没有文件名冲突,路径的顺序没有影响,
*如果你照看一个已经在路径中定义的函数append用于添加路径,您将无法获得预定义的函数.
但我认为最好使用append而不是insert不重载Python的标准行为,并对文件和方法使用非模糊名称.
| 归档时间: |
|
| 查看次数: |
79642 次 |
| 最近记录: |