我拥有最简单的测试包,它可以在一台PC上完美运行,但不能在另一台PC上运行,都可以运行Python 3.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
@meowgoesthedog询问是否要手动将当前工作目录添加到PYTHONPATH中,所以我进行了另一项测试:我升至G:\
的另一个级别,将__init__.py
添加到{{1} },然后将app.py转换为:
G:\
它仍然可以在我的PC上运行,可以显示:
# 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()
您可以看到cwd再次添加到PYTHONPATH中。
更新3
我在Mac上测试了相同的代码,结果与另一台“不工作”的PC相匹配,即cwd是 NOT 自动添加到PYTHONPATH的。经过py27和py37的测试。
所以我的主PC上的某些东西可能会有所不同,它会自动将CWD添加到PYTHONPATH中。但是如何?