https://www.cnblogs.com/pengfy/p/12108054.html
pyinstaller报错urllib3.packages.six.moves pre-safe-import-module hook failed, needs fixing.
在使用pyinstaller打包时,出现了以下错误:
urllib3.packages.six.moves pre-safe-import-module hook failed, needs fixing.
找了很久没有找到问题所在,突然想起来之前因为另一个问题,修改了python自带的subprocess.py文件里面的popen类的__init__,将里面的shell=False改成了shell=True,试着改回来,发现问题解决了。
所以还是不要随便改动python自带的库,因为其他第三方库之间的依赖是复杂的关系。
https://blog.csdn.net/xiaoyaozizai017/article/details/72794469
shell=True参数会让subprocess.call接受字符串类型的变量作为命令,并调用shell去执行这个字符串,当shell=False是,subprocess.call只接受数组变量作为命令,并将数组的第一个元素作为命令,剩下的全部作为该命令的参数。
举个例子来说明:
from subprocess import call
import shlex
cmd = "cat test.txt; rm test.txt"
call(cmd, shell=True)
上述脚本中,shell=True的设置,最终效果是执行了两个命令
cat test.txt 和 rm test.txt
把shell=True 改为False,
from subprocess import call
import shlex
cmd = "cat test.txt; rm test.txt"
cmd = shlex(cmd)
call(cmd, shell=False)
则调用call的时候,只会执行cat的命令,且把 “test.txt;” “rm” “test.txt” 三个字符串当作cat的参数,所以并不是我们直观看到的好像有两个shell命令了。
也许你会说,shell=True 不是很好吗,执行两个命令就是我期望的呀。但其实,这种做法是不安全的,因为多个命令用分号隔开,万一检查不够仔细,执行了危险的命令比如 rm -rf / 这种那后果会非常严重,而使用shell=False就可以避免这种风险。
总体来说,看实际需要而定,官方的推荐是尽量不要设置shell=True。