一、问题描述
使用pipenv管理项目,一直好好的,忽然在一个项目中发现,不管安装多少次虚拟环境pipenv graph都会报错
Exception in thread Thread-2:
......
IndexError: list index out of range
D:\代码\weebot\wibot_bot>pipenv graphException in thread Thread-2:
Traceback (most recent call last):
File "E:\python3.8\lib\threading.py", line 932, in _bootstrap_inner
self.run()
File "E:\python3.8\lib\threading.py", line 870, in run
self._target(*self._args, **self._kwargs)
File "E:\python3.8\lib\subprocess.py", line 1366, in _readerthread
buffer.append(fh.read())
UnicodeDecodeError: 'gbk' codec can't decode byte 0x82 in position 1268: illegal multibyte sequence
Traceback (most recent call last):
File "E:\python3.8\lib\runpy.py", line 192, in _run_module_as_main
return _run_code(code, main_globals, None,
File "E:\python3.8\lib\runpy.py", line 85, in _run_code
exec(code, run_globals)
File "E:\python3.8\Scripts\pipenv.exe\__main__.py", line 7, in
File "E:\python3.8\Lib\site-packages\pipenv\vendor\click\core.py", line 829, in __call__
return self.main(*args, **kwargs)
File "E:\python3.8\Lib\site-packages\pipenv\vendor\click\core.py", line 782, in main
rv = self.invoke(ctx)
File "E:\python3.8\Lib\site-packages\pipenv\vendor\click\core.py", line 1259, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "E:\python3.8\Lib\site-packages\pipenv\vendor\click\core.py", line 1066, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "E:\python3.8\Lib\site-packages\pipenv\vendor\click\core.py", line 610, in invoke
return callback(*args, **kwargs)
File "E:\python3.8\lib\site-packages\pipenv\cli\command.py", line 621, in graph
do_graph(bare=bare, json=json, json_tree=json_tree, reverse=reverse)
File "E:\python3.8\lib\site-packages\pipenv\core.py", line 2789, in do_graph
c = run_command(cmd_args)
File "E:\python3.8\lib\site-packages\pipenv\utils.py", line 154, in run_command
c = delegator.run(cmd_string, *args, **kwargs)
File "E:\python3.8\lib\site-packages\pipenv\vendor\delegator.py", line 339, in run
c.block()
File "E:\python3.8\lib\site-packages\pipenv\vendor\delegator.py", line 248, in block
stdout, stderr = self.subprocess.communicate()
File "E:\python3.8\lib\subprocess.py", line 1024, in communicate
stdout, stderr = self._communicate(input, endtime, timeout)
File "E:\python3.8\lib\subprocess.py", line 1418, in _communicate
stderr = stderr[0]
IndexError: list index out of range
之前的项目已经存在的虚拟环境就不存在这个错误,可以正常输出,证明是虚拟环境的错误
我期间安装过32位的python,总是造成环境异常,执行pipenv install的时候总是优先使用32位的,虽然环境变量在后面,所以就卸载了,感觉还是因为这个问题
经过一上午来回测试,最终解决:
到这里还没有结束,因为新项目用到了win32api模块,但是不能直接安装好,需要安装pypiwin32后才能导入win32api,
执行了pipenv install pypiwin32 后,直接把环境给我交了个底朝天:
这才最终明白,是安装这个模块的时候,pipenv把本来是64的系统模块全给卸载替换为32的了,所以环境就变了
随后我执行pipenv uninstall pypiwin32 ,但是没用的,环境已经变了
然后执行 pipenv --rm 移除环境重新安装,也不行
xxoo..............................ooxx一顿操作,最后发现必须执行以下几步才行:
第一步: pipenv --rm 移除环境,且需要到系统存放文件夹确认没有这个环境了,执行pipenv graph确认没有环境了
第二步:删除该项目的pipfile和lock文件,将正常项目的pipfile和lock文件复制过来(即使看起来一样也不行,不知道哪里受到污染了,必须替换)
第三步:pipenv install 安装新环境,然后执行pipenv graph就没问题了,随后你的项目需要什么模块再通过 pipenv install xxoo 安装补充回来就好了( pypiwin32已安装就坏了,用其他相同工功能模块代替吧)
二、pipenv install 模块名 出错
补充:经过测试发现了,那些不能用pipenv install xxoo 直接安装记录到pipfile的模块,可以通过以下几步稍微麻烦点使用:
第一步:一个项目环境可以pipenv install 安装所有pipfile中记录在册的模块
第二步:pipenv shell 进入该虚拟环境
第三步:pip install pypiwin32 这样在虚拟环境内部用pip安装pipenv安装出错的模块,就可以正常使用了(之前用腾讯云的模块,也是支持pip,也是测试后发现这样的方法可以成功)