这些问题详细说明了我无法向自己解释的行为。
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语句非常有效。
我应该明白我不打算调用包的子文件吗?在我的项目中,它是一个测试文件,所以这听起来合乎逻辑。
为什么当前工作目录不在导入路径中?
非常感谢那些阅读和回答的人。
答案 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 运行:
src
启动一个解释器时,''
位于sys.path
,因此可以找到src
的路径; 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
,而不是运行脚本的路径。在程序启动时初始化,此列表的第一项path [0]是包含用于调用Python解释器的脚本的目录。如果脚本目录不可用(例如,如果以交互方式调用解释器或者从标准输入读取脚本),则路径[0]为空字符串,它指示Python首先搜索当前目录中的模块。请注意,在作为PYTHONPATH的结果插入条目之前插入了脚本目录。