ModuleNotFoundError с setup.py/easy_install, но pip работает - PullRequest
0 голосов
/ 02 ноября 2018

Я занимаюсь разработкой приложения и хочу поместить его в активный venv с помощью «setup.py development». Это не работает правильно; Python не находит установленные зависимости впоследствии.

Если я соберу колесо из него и установлю его с помощью pip, все будет нормально.

Сокращенный журнал установки ниже. Полный вывод занимает немного больше времени, но он успешно устанавливается только один пакет за другим.

C:\Daten\pyv>py -3.7-32 -m venv v37-32

C:\Daten\pyv>v37-32\Scripts\activate

(v37-32) C:\Daten\pyv>cd ..\Projekte\i\IB4Application

(v37-32) C:\Daten\Projekte\I\IB4Application>python setup.py develop
running develop
Checking .pth file support in C:\Daten\pyv\v37-32\Lib\site-packages\
C:\Daten\pyv\v37-32\Scripts\pythonw.exe -E -c pass
TEST PASSED: C:\Daten\pyv\v37-32\Lib\site-packages\ appears to support .pth files

[...]

Installed c:\daten\projekte\i\ib4application
Processing dependencies for IB4Application==1.0
Searching for PyQt5<6

[...]

Installing PyQt5-5.11.3-5.11.2-cp35.cp36.cp37.cp38-none-win32.whl to c:\daten\pyv\v37-32\lib\site-packages
writing requirements to c:\daten\pyv\v37-32\lib\site-packages\PyQt5-5.11.3-py3.7-win32.egg\EGG-INFO\requires.txt
Adding PyQt5 5.11.3 to easy-install.pth file

[... горы зависимостей ...]

Searching for PyQt5_sip<4.20,>=4.19.11

[...]

Installing PyQt5_sip-4.19.13-cp37-none-win32.whl to c:\daten\pyv\v37-32\lib\site-packages
Adding PyQt5-sip 4.19.13 to easy-install.pth file

[... горы зависимостей ...]

Finished processing dependencies for IB4Application==1.0

Теперь, когда установка завершена, я перехожу из пути проекта, чтобы избежать случайного относительного импорта.

(v37-32) C:\Daten\Projekte\I\IB4Application\IB4Application>cd ..\..

Я запускаю скрипт-обертку, созданный при установке, и получаю сообщения об ошибках.

(v37-32) C:\Daten\Projekte\I>python ..\..\pyv\v37-32\Scripts\IB4Application-script.pyw
Traceback (most recent call last):
  File "c:\daten\projekte\i\ib4application\IB4Application\main.py", line 17, in main
    from . import app
  File "c:\daten\projekte\i\ib4application\IB4Application\app.py", line 7, in <module>
    from PyQt5.QtCore import QSize, QThread, QObject, pyqtSignal
ModuleNotFoundError: No module named 'PyQt5.sip'

Такая же ошибка происходит, если я import PyQt5.sip прямо в REPL.

Каталог сайтов-пакетов venv выглядит следующим образом (без всех других зависимостей):

2018-11-02  19:37               420 easy-install.pth
2018-11-02  19:37               126 easy_install.py
2018-11-02  19:37                37 IB4Application.egg-link
2018-11-02  19:37    <DIR>          pip
2018-11-02  19:37    <DIR>          pip-10.0.1.dist-info
2018-11-02  19:37    <DIR>          pkg_resources
2018-11-02  19:37    <DIR>          PyQt5-5.11.3-py3.7-win32.egg
2018-11-02  19:37    <DIR>          PyQt5_sip-4.19.13-py3.7-win32.egg
2018-11-02  19:37    <DIR>          setuptools
2018-11-02  19:37    <DIR>          setuptools-39.0.1.dist-info

Обратите внимание, что setup.py установил все колеса как яйца. easy-install.pth имеет:

c:\daten\projekte\i\ib4application
./pyqt5-5.11.3-py3.7-win32.egg
./pyqt5_sip-4.19.13-py3.7-win32.egg

Недостающий модуль находится в ./pyqt5_sip-4.19.13-py3.7-win32.egg\PyQt5\sip.pyd, именно там, где он находится в этой среде.

Если я начну с пустого venv и установлю готовое колесо приложения с помощью pip, оно установит зависимости в стиле "dist-info", а соответствующая часть site-пакетов выглядит следующим образом:

2018-11-02  19:56    <DIR>          PyQt5
2018-11-02  19:56    <DIR>          PyQt5-5.11.3.dist-info
2018-11-02  19:56    <DIR>          PyQt5_sip-4.19.13.dist-info

Запуск приложения теперь работает, но без специальных функций setup.py develop.

Я попытался запустить Python под procmon, чтобы увидеть, действительно ли он просматривал каталоги egg, и обнаружил, что, когда он просматривает записи в easy-install.pth при поиске PyQt5.sip, он, похоже, немного запутался, потому что он пытается открыть файл с именем "" в каждом из каталогов. Каждый раз, когда это терпит неудачу, это пробует следующее яйцо. Это также доказывает, что ошибка не связана с отсутствующими зависимостями DLL, потому что Python даже не пытается ее загрузить.

1 Ответ

0 голосов
/ 05 ноября 2018

Не совсем ответ, но, по крайней мере, обходной путь. Я только что узнал о pip install -e ., и, конечно, это работает.

...