Python路径解释:从子包导入

时间:2014-01-25 15:49:10

标签: python python-2.7 path pythonpath

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

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

来自srcpython package/test/test.py的来电与ImportError: No module named subpackage失败。请注意,import package也不起作用。

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

我应该明白我不打算调用包的子文件吗?在我的项目中,它是一个测试文件,所以这听起来合乎逻辑。

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

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

2 个答案:

答案 0 :(得分:3)

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

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

来自文档

  

当导入名为spam的模块时,解释器首先搜索具有该名称的内置模块。如果没有找到,它会在变量sys.path

给出的目录列表中搜索名为spam.py的文件。
>>> import sys
>>> sys.path

输出就像这样

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

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

答案 1 :(得分:1)

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

  1. 当您从src启动一个解释器时,''位于sys.path,因此可以找到src的路径;
  2. 当您从python package/test/test.py运行src时,''中缺少sys.path,但os.path.abspath('.')显示当前目录为"<xxx>\\src",{{ 1}}不在"<xxx>\\src",而sys.path"<xxx>\\src\\package\\test"。这就是说,python将文件路径添加到sys.path,而不是运行脚本的路径。
  3. 请参阅what the docs says

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