我有这样的文件和文件夹结构:
package1/
p1.py
package2/
p2.py
package1/p1.py
的内容:
def p1fun():
print("p1fun")
package1/package2/p2.py
的内容:
import package1.p1
if __name__ == '__main__':
package1.p1.p1fun()
现在,当我这样做
python -m package1.package2.p2
时,我得到了正确的结果 = p1fun
。当我这样做 python package1/package2/p2.py
时,我得到:
Traceback (most recent call last):
File "/home/marcin/projects/test/package1/package2/p2.py", line 1, in <module>
import package1.p1
ModuleNotFoundError: No module named 'package1'
这两种情况下导入机制有何不同?如何让“脚本”场景正确导入?
您只需将包含package1的目录添加到
sys.path
即可。一个简单的方法是将 PYTHONPATH
环境变量设置为 .
:
export PYTHONPATH='.' # on Linux or other Unix-like
set PYTHONPATH=. # on Windows
根本原因:
正如@KlausD 所解释的。 ,python 会自动添加在命令行中传递的脚本的路径,或者使用
python -m
启动模块时的当前路径。 看到的一个简单方法是在靠近sys.path
开头处打印p2.py
:
import package1.p1
import sys
print(sys.path)
if __name__ == '__main__':
package1.p1.p1fun()
对于
python -m package1.package2.p2
,您可以看到列表的第一个元素是当前文件夹,对于 python package1/package2/p2.py
,您将看到:/path/to/current/package1/package2