导入找不到我刚刚通过同一程序安装的模块

时间:2019-01-25 16:01:40

标签: python windows python-2.7 import pip

我正在编写一个python安装程序脚本,该脚本需要通过脚本内的pip安装2个其他模块,然后导入并使用这些模块在同一脚本中完成安装。 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>

3 个答案:

答案 0 :(得分:0)

这是一种可能的解决方案,我建议您检查一下:

尝试使用pypiwin32安装pip install pypiwin32

此问题似乎与您的代码无关,而是与模块安装本身有关。我仍然觉得它很奇怪,因为它在您第二次运行时效果很好,但是仍然值得尝试

答案 1 :(得分:0)

如果在程序执行期间安装新模块,则需要invalidate the module finder caches以确保导入系统可以看到新模块:

import importlib
importlib.invalidate_caches()

答案 2 :(得分:-1)

请注意,不要选择与库或模块名称相同的文件名。 例如,如果我想使用请求并将其导入,如果我选择文件名“ requests” 运行时,代码将引发错误