从脚本导入与从模块导入有何不同?

问题描述 投票:0回答:1

我有这样的文件和文件夹结构:

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'

这两种情况下导入机制有何不同?如何让“脚本”场景正确导入?

python python-import
1个回答
0
投票

您只需将包含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

© www.soinside.com 2019 - 2024. All rights reserved.