一个 Python import 模块失败的问题

2018-10-12 16:49:06 +08:00
 c00WKmdje2wZLrSI

代码如下:

import os

try:
    import winshell
except:
    os.system('python -m pip  install --upgrade pip')
    os.system('pip install pywin32')
    os.system('pip install winshell')
    import winshell

print('hello world')

我的本意是导入 winshell 这个模块,要是机子里没这个模块的话,就先安装再导入,但是运行的时候报错了

看运行过程,明明的确按计划安装了两个所需的模块,但是接下来又报错说没有 winshell 模块,这是怎么回事?

第二遍运行的话又没问题,说明第一遍的确安装成功了两个模块,但是第一遍的报错是怎么一回事呢?

3855 次点击
所在节点    Python
17 条回复
raycool
2018-10-12 16:55:32 +08:00
我的理解:
python 安装后是不是还要更新类似索引等操作。
而安装成功后直接就调用了,根本没等索引什么的重建完成
故报错
shallyy
2018-10-12 16:56:20 +08:00
试试把 site-packages 的路径加入到 PYTHONPATH 环境变量
beny2mor
2018-10-12 16:57:49 +08:00
用了 anaconda 之后就再也没碰到这些问题了
你可以考虑下用类似的工具
c00WKmdje2wZLrSI
2018-10-12 17:01:15 +08:00
@raycool
神奇之处在于,按这样子做,requests 模块又没关系
![图片]( https://i.loli.net/2018/10/12/5bc0629d140c9.png)
c00WKmdje2wZLrSI
2018-10-12 17:05:06 +08:00
@shallyy 但是 requests 模块这样子的话又没问题
c00WKmdje2wZLrSI
2018-10-12 17:05:55 +08:00
@beny2mor 我的问题是为什么第一遍运行的时候会出问题,但是第二遍就没问题了
beny2mor
2018-10-12 17:29:16 +08:00
明白。。
在 python 脚本里运行 pip 安装包有点奇怪。
应该和 python 的加载机制有关。你可以查下文档,https://docs.python.org/3/reference/import.html#searching
0ZXYDDu796nVCFxq
2018-10-12 17:32:54 +08:00
这个不是运维的事吗,为啥要在代码里写这些东西……

requirements.txt 了解一下
lniwn
2018-10-12 17:50:44 +08:00
把第二个 import winshell 换成 subprocess.Popen(['python.exe', os.path.realpath(__file__)], creationflags=0x00000008)试试
c00WKmdje2wZLrSI
2018-10-12 19:40:21 +08:00
@lniwn 主要是这种方法装 requests 模块又没问题
c00WKmdje2wZLrSI
2018-10-12 19:42:01 +08:00
@beny2mor 主要是这种方法装 requests 模块又没问题
beny2mor
2018-10-12 19:54:50 +08:00
@c00WKmdje2wZLrSI 你这报错说`winshell`找不到`wincon`,真要搞明白就得去了解下 python 模块加载机制了。。。
还是不要纠结这个问题了,就在运行 python 脚本前先安装了依赖。。
浪费时间在这个地方没意义,非常规操作....
pabupa
2018-10-12 23:46:03 +08:00
win32 什么的应该还是 dll 吧,,requests 和它的依赖都是纯 Python 的,可能是这点区别,加载机制不一样吧……
zyqf
2018-10-13 07:34:59 +08:00
使用 sys.path.insert 重新添加环境目录
swordspoet
2018-10-13 08:10:53 +08:00
第一次执行脚本,脚本安装 package,当执行到 import 语句,刚刚安装好的 package 还没有被索引到。我猜是这个原因。
publicvoid
2018-10-13 09:35:47 +08:00
13 楼很有可能是正解, 楼主这种情况是 request 不需要依赖 dll,winshell 肯定依赖 windows,话说什么场景为要这样动态导入?
YaphetYin
2018-10-13 17:14:38 +08:00
reload sys.modules

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/497116

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX