Не удается найти субмодуль в пакете на одном ПК, но не на другом ПК - PullRequest
0 голосов
/ 10 июня 2019

У меня есть самый простой тестовый пакет, который отлично работает на одном ПК, но не на другом, оба работают под управлением 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. Но как?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...