我正在编写一个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>
答案 0 :(得分:0)
这是一种可能的解决方案,我建议您检查一下:
尝试使用pypiwin32
安装pip install pypiwin32
此问题似乎与您的代码无关,而是与模块安装本身有关。我仍然觉得它很奇怪,因为它在您第二次运行时效果很好,但是仍然值得尝试
答案 1 :(得分:0)
如果在程序执行期间安装新模块,则需要invalidate the module finder caches以确保导入系统可以看到新模块:
import importlib
importlib.invalidate_caches()
答案 2 :(得分:-1)
请注意,不要选择与库或模块名称相同的文件名。 例如,如果我想使用请求并将其导入,如果我选择文件名“ requests” 运行时,代码将引发错误