【问题标题】:what is the difference in package loading between python -m and python [file]? [duplicate]python -m 和 python [file] 之间的包加载有什么区别? [复制]
【发布时间】:2020-12-06 21:09:33
【问题描述】:

当我运行 python -m moduala.testpython moduala/testa.py 之类的东西时,我在 python3 中看到了不同的包处理行为。在 -m 情况下,在 testa.py 中导入 moduala.modualb.pkgx 可以工作,而在另一种情况下,它们不起作用。

python --version
# Python 3.6.9

mkdir -p testpyproj/pkga/pkgb
cd testpyproj/

touch pkga/__init__.py
touch pkga/pkgb/__init__.py

echo 'print("# python!")' >pkga/pkgb/modx.py
echo 'from pkga.pkgb import modx' > pkga/test.py

python -m pkga.test
# python!

python pkga/test.py 
# Traceback (most recent call last):
#  File "pkga/test.py", line 1, in <module>
#     from pkga.pkgb import modx
# ImportError: No module named pkga.pkgb

从手册页我希望这些是相同的:

  -m module-name
         Searches sys.path for the named module and 
         runs the corresponding .py file as a script.

python -m 和 python [file] 用于加载模块和处理包有什么区别?

为什么python[文件]找不到pkga.pkgb?

【问题讨论】:

标签: python python-3.x python-module python-packaging


【解决方案1】:

当python从命令行运行脚本时,比如:

$ python pkga/test.py

知道它正在运行一个相关脚本。因此,它会将sys.path[0] 的值更改为脚本的目录。

当 python 从命令行打开一个模块时,它必须有一个模块搜索路径(又名sys.path)才能找到该模块。因此它将sys.path[0] 设置为""(空字符串)以表示“当前目录”。然后它会搜索sys.path 指示的所有位置,试图找到您提供的模块名称。

这样做的结果是,在一种情况下,您的sys.path[0] 将是"",而在另一种情况下,它将是/path/to/current/directory/pkga。然后当搜索路径从该位置开始时,它无法解析pkga.pkgb

您可以通过添加以下内容来确认:

import sys
print(sys.path)

pkga/test.py 的开头,在任何其他导入之前。您将在模块导入异常之前看到打印输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    • 2014-02-24
    • 1970-01-01
    • 2016-09-05
    • 1970-01-01
    相关资源
    最近更新 更多