找不到子模块在一个电脑上但另一个电脑上找到了一个包

2024-04-29 05:02:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个最简单的测试包,可以在一台电脑上完美地工作,但不能在另一台电脑上工作,这两台电脑都运行python3.7.3 64位Windows

问题是主脚本无法使用相对路径导入子文件夹中的子模块,只能在其中一台计算机上导入

软件包结构

pypkg/
    __init__.py
    src/
        __init__.py
        app.py
    util/
        __init__.py
        util.py

src/app.py的工作方式如下

# app.py

from pprint import pprint
import sys
pprint(sys.path, indent=4)

from util import util


def main():
    print('this is app.')
    util.func()
    pprint(sys.path, indent=4)


if __name__ == '__main__':
    main()

util/util.py如下所示

def func():
    print('this is func from util.')

现在在我编写代码的第一台PC上,打开命令提示符cd /path/to/pypkg,然后运行

python src\app.py

这给了我:

G:\pypkg>python src\app.py
[   'G:\\pypkg\\src',
    'C:\\Apps\\Csound6_x64\\bin',
    'G:\\pypkg',
    'C:\\Python\\Python37\\python37.zip',
    'C:\\Python\\Python37\\DLLs',
    'C:\\Python\\Python37\\lib',
    'C:\\Python\\Python37',
    'C:\\Python\\Python37\\lib\\site-packages']
this is app.
this is func from util.
[   'G:\\pypkg\\src',
    'C:\\Apps\\Csound6_x64\\bin',
    'G:\\pypkg',
    'C:\\Python\\Python37\\python37.zip',
    'C:\\Python\\Python37\\DLLs',
    'C:\\Python\\Python37\\lib',
    'C:\\Python\\Python37',
    'C:\\Python\\Python37\\lib\\site-packages']

注意,当前工作目录,即这个包的根目录,会自动添加到sys.path

现在将同一个包复制到另一台PC的相同的逻辑位置下,并在/path/to/pypkg/下运行代码

这给了我:

g:\pypkg>python src\app.py
[   'g:\\pypkg\\src',
    'C:\\Python\\Python37\\python37.zip',
    'C:\\Python\\Python37\\DLLs',
    'C:\\Python\\Python37\\lib',
    'C:\\Python\\Python37',
    'C:\\Python\\Python37\\lib\\site-packages']
Traceback (most recent call last):
  File "src\app.py", line 7, in <module>
    from util import util
ModuleNotFoundError: No module named 'util'

注意,这一次工作目录并不是自己添加到sys.path

除了第二台机器的命令提示符用小写字母显示所有的驱动器号,而第一台机器的命令提示符用大写字母显示所有的驱动器号之外,我不知道这两台机器之间的区别在哪里。 请帮帮我

更新

现在,我找到了一个解决方法,可以让事情的行为保持一致:像这样运行脚本:

python -m src.app

为什么

更新2

当@meowgoesdog提问时,如果我手工将当前工作目录添加到PYTHONPATH,我做了另一个测试:我进入到另一个级别G:\,将__init__.py添加到G:\,然后将app.py变成:

# app.py

from pprint import pprint
import sys
pprint(sys.path, indent=4)

from pypkg.util import util


def main():
    print('this is app.')
    util.func()
    pprint(sys.path, indent=4)


if __name__ == '__main__':
    main()

它仍然在我的电脑上运行,它提供:

G:\>python g:\pypkg\src\app.py
[   'g:\\pypkg\\src',
    'C:\\Apps\\Csound6_x64\\bin',
    'G:\\',
    'C:\\Python\\Python37\\python37.zip',
    'C:\\Python\\Python37\\DLLs',
    'C:\\Python\\Python37\\lib',
    'C:\\Python\\Python37',
    'C:\\Python\\Python37\\lib\\site-packages']
this is app.
this is func from util.
[   'g:\\pypkg\\src',
    'C:\\Apps\\Csound6_x64\\bin',
    'G:\\',
    'C:\\Python\\Python37\\python37.zip',
    'C:\\Python\\Python37\\DLLs',
    'C:\\Python\\Python37\\lib',
    'C:\\Python\\Python37',
    'C:\\Python\\Python37\\lib\\site-packages']

您可以看到cwd再次被添加到PYTHONPATH中

更新3

我在Mac上测试了相同的代码,结果与另一台“不工作”的PC相匹配,即cwd不是自动添加到PYTHONPATH的。用py27和py37测试

所以在我的主PC上可能有些不同,它会自动将cwd添加到PYTHONPATH。但是怎么做呢


Tags: pathfrompyimportsrcappismain