импорт не может найти модуль, который я только что установил через ту же программу - PullRequest
0 голосов
/ 25 января 2019

Я пишу скрипт установки Python, который должен установить 2 дополнительных модуля через pip внутри скрипта, затем импортировать и использовать эти модули для завершения установки в том же скрипте.Вызов pip работает нормально, но когда я пытаюсь импортировать модуль ( winshell ), который я только что установил, я получаю сообщение об ошибке, что он не может импортировать другой модуль (win32con), который является частью второго установленного мной модуля ( pywin32 ).

Если я перезапущу скрипт после ошибки, все будет работать так, как должно, поэтому я знаю, что фактическая установка pip работает правильно.Мне кажется, что запущенный скрипт python просто не знает о некоторых из установленных модулей, пока программа не будет перезапущена.Есть ли способ заставить работающий скрипт «обновлять» модули, которые он видит, доступными без необходимости перезапуска программы?

Вот упрощенный код:

import os
import sys
try:
    from pip import main as pipmain
except ImportError:
    from pip._internal import main as pipmain

def create_shortcut():
    print 'Creating shortcut...'
    import winshell

    link_filepath = os.path.join(winshell.desktop(), "Start.lnk")
    with winshell.shortcut(link_filepath) as link:
        link.path = sys.executable
        link.description = "Shortcut to startup"
        link.arguments = r"C:\temp\my_program.py"

def install_requirements():
    print 'Installing requirements...'
    pipmain(['install', '-r', 'wheelhouse/requirements.txt', '--no-index', '--find-links', 'wheelhouse'])

if __name__ == '__main__':
    install_requirements()
    create_shortcut()

Вот ошибка:

C:\temp>python my_installer.py
Installing requirements...
Looking in links: wheelhouse
Collecting pywin32>=224 (from -r wheelhouse/requirements.txt (line 1))
Collecting winshell>=0.6 (from -r wheelhouse/requirements.txt (line 2))
Installing collected packages: pywin32, winshell
Successfully installed pywin32-224 winshell-0.6
Creating shortcut...
Traceback (most recent call last):
   File "my_installer.py", line 24, in <module>
create_shortcut()
   File "my_installer.py", line 10, in create_shortcut
import winshell
   File "C:\Python27\lib\site-packages\winshell.py", line 30, in <module>
     import win32con
ImportError: No module named win32con

Когда я запускаю второй раз (и модули уже установлены):

C:\temp>python my_installer.py
Installing requirements...
Looking in links: wheelhouse
Requirement already satisfied: pywin32>=224 in c:\python27\lib\site-packages (from -r wheelhouse/requirements.txt (line 1)) (224)
Requirement already satisfied: winshell>=0.6 in c:\python27\lib\site-packages (from -r wheelhouse/requirements.txt (line 2)) (0.6)

Creating shortcut...

C:\temp>

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Если вы устанавливаете новые модули во время выполнения программы, вам необходимо сделать недействительными кэши модуля поиска модулей , чтобы убедиться, что система импорта видит новые модули:

import importlib
importlib.invalidate_caches()
0 голосов
/ 26 января 2019

Это возможное решение, которое я бы порекомендовал вам проверить:

попробуйте установить pypiwin32 с использованием pip install pypiwin32

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

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