我有一个最简单的测试包,可以在一台电脑上完美地工作,但不能在另一台电脑上工作,这两台电脑都运行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。但是怎么做呢
目前没有回答
相关问题 更多 >
编程相关推荐