У меня есть самый простой тестовый пакет, который отлично работает на одном ПК, но не на другом, оба работают под управлением 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.')
Теперь на первом компьютере, на котором я написал код, я открываю командную строку 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
.
Теперь скопируйте тот же пакет на другой компьютер в том же логическом месте и и запустите код, все еще находящийся в /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
сам по себе.
Кроме того, что в командной строке второй машины все буквы дисков отображаются строчными, а в первой заглавной, я не могу понять, в чем разница между машинами.
Пожалуйста, помогите!
UPDATE
Теперь я нашел обходной путь, чтобы заставить вещи вести себя одинаково: Запустите скрипт так:
python -m src.app
Почему ??
ОБНОВЛЕНИЕ 2
В качестве вопроса @meowgoesthedog, если я вручную добавлю текущий каталог в PYTHONPATH, я провел еще один тест: я перехожу на еще один уровень до G:\
, добавляю __init__.py
в G:\
, затем включаю приложение. пи в:
# 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, и результат совпадает с другим "неработающим" ПК, то есть cwd NOT автоматически добавляется в PYTHONPATH. Протестировано с py27 и py37.
Так что, скорее всего, что-то другое на моем основном ПК, где он автоматически добавляет cwd в PYTHONPATH. Но как?