Python路径说明:从子包导入

2024-06-06 11:45:17 发布

您现在位置:Python中文网/ 问答频道 /正文

这些问题详细说明了我无法解释的行为。

src/package/__init__.py为空但存在。

src/package/subpackage/__init__.py

pink = 'It works'

src/package/test/test.py

import package.subpackage as subpackage
# I also tried `import package.subpackage as subpackage

print subpackage.pink

src:调用python package/test/test.py失败,出现ImportError: No module named subpackage。请注意,import package也不起作用。

注意:(从src运行一个解释器并键入import语句非常有效。

我应该知道我不应该调用包的子文件吗?在我的项目中,它是一个测试文件,所以对我来说,这里有它是合乎逻辑的。

为什么当前工作目录不在导入路径中?

非常感谢那些阅读和回答的人。


Tags: 文件pytestimportsrcpackageinitas
2条回答

因为你的包裹不在$PYTHONPATH里。如果要调用test.py,可以将test.py文件移动到src/目录,或者将src添加到$PYTHONPATH

PYTHONPATH="/path/to/src:$PYTHONPATH"
export PYTHONPATH

来自文档

When a module named spam is imported, the interpreter first searches for a built-in module with that name. If not found, it then searches for a file named spam.py in a list of directories given by the variable sys.path

>>> import sys
>>> sys.path

输出如下

['.', '/usr/bin', ...

这意味着当前目录也在sys.path中。如果要导入模块,请确保模块路径位于sys.path中,方法是将包目录添加到环境变量PYTHONPATH,或将当前目录或脚本目录更改为包目录。

在python package/test/test.py失败时,它也从src运行:

  1. 当您从src启动interpreter时,''位于sys.path中,因此可以找到src的路径
  2. src运行python package/test/test.py时,sys.path中缺少'',尽管os.path.abspath('.')显示当前目录是"<xxx>\\src""<xxx>\\src"不在sys.path中,而"<xxx>\\src\\package\\test"sys.path中。也就是说,python将文件的路径添加到sys.path,而不是运行脚本的路径。

what the docs says

在程序启动时初始化,此列表的第一项,路径[0]是包含用于调用Python解释器的脚本的目录。如果脚本目录不可用(例如,如果以交互方式调用解释器或从标准输入读取脚本),则路径[0]是空字符串,它指示Python首先搜索当前目录中的模块。注意,脚本目录是在PYTHONPATH结果插入的条目之前插入的。

相关问题 更多 >