PyWin32 (226) 和虚拟环境
PyWin32 (226) and virtual environments
[PyPI]: pywin32 226 has been released on 20191110.
It works on most of the Python installations (e.g. works on the official versions downloaded from Python),但在虚拟环境中不是(例如 使用VirtualEnv (v16.7.7),以及(基于进一步研究)Python的 venv)。
我用了Pythonv3.8.0和v3.7.3 作为实验鼠。这是前者的输出:
[cfati@CFATI-5510-0:e:\Work\Dev\Whosebug\q058805040]> "e:\Work\Dev\VEnvs\py_064_03.08.00_test0\Scripts\python.exe" -c "import win32api"
Fatal Python error: init_import_size: Failed to import the site module
Python runtime state: initialized
Traceback (most recent call last):
File "e:\Work\Dev\VEnvs\py_064_03.08.00_test0\lib\site.py", line 769, in <module>
main()
File "e:\Work\Dev\VEnvs\py_064_03.08.00_test0\lib\site.py", line 746, in main
paths_in_sys = addsitepackages(paths_in_sys)
File "e:\Work\Dev\VEnvs\py_064_03.08.00_test0\lib\site.py", line 279, in addsitepackages
addsitedir(sitedir, known_paths)
File "e:\Work\Dev\VEnvs\py_064_03.08.00_test0\lib\site.py", line 202, in addsitedir
addpackage(sitedir, name, known_paths)
File "e:\Work\Dev\VEnvs\py_064_03.08.00_test0\lib\site.py", line 170, in addpackage
exec(line)
File "<string>", line 1, in <module>
File "e:\Work\Dev\VEnvs\py_064_03.08.00_test0\lib\site-packages\win32\lib\pywin32_bootstrap.py", line 14, in <module>
for maybe in site.getsitepackages():
AttributeError: partially initialized module 'site' has no attribute 'getsitepackages' (most likely due to a circular import)
注意:我从 分支了这个答案(以及问题),因为这是一个不同的问题。在继续之前,您可能需要检查一下。
经过一番挖掘,发现这是一个 VirtualEnv bug(或者至少,我是这么看的,因为 VirtualEnv 的 site.py 不包含 getsitepackages - 虽然它存在于 Python的site.py自v2.7)。
有几个问题(曾经)围绕这种缺席展开(例如 [GitHub]: pypa/virtualenv - site.getsitepackages() missing), but they appear to be closed without a fix (many of them due to inactivity). Also, [GitHub]: [WIP] The next-gen virtualenv (rewrite),这是一个很大的重构,似乎没有解决它。
Recap: 这个错误(在VirtualEnv上下文):
- 也适用于其他Python版本(我可以确认v3.7.3(32bit ))
- 每次解释器启动时发生
总而言之,不要在 (VirtualEnv) 虚拟环境中安装 PyWin32 226,因为它们最终会处于崩溃状态!
PyWin32(官方.whls)"compatibility table"(没查Anaconda(或其他此类工具)):
- "Normal"(官方)Python 安装:
- v226 是 OK
- VirtualEnvs(还有Python的标准venvs ):
- v225 是 OK
- 对于Python 3.8.0,应该使用[GitHub]: CristiFati/Prebuilt-Binaries - (master) Prebuilt-Binaries/PyWin32/v225
已提交 [GitHub]: mhammond/pywin32 - Workaround for virtual environments (VirtualEnv)(合并于 20191114)。在本地应用更改(查看参考问题以获取有关如何操作的详细信息),修复它:
[cfati@CFATI-5510-0:e:\Work\Dev\Whosebug\q058805040]> sopr.bat
*** Set shorter prompt to better fit when pasted in Whosebug (or other) pages ***
[prompt]> ".\venv_py_064_030800\Scripts\python.exe" -m pip list
Package Version
---------- -------
pip 19.3.1
pywin32 226
setuptools 41.6.0
wheel 0.33.6
[prompt]> ".\venv_py_064_030800\Scripts\python.exe" -c "import win32api"
[prompt]>
更新#0
[PyPI]: pywin32 227(解决了这个问题),发表于 20191114!
[PyPI]: pywin32 226 has been released on 20191110.
It works on most of the Python installations (e.g. works on the official versions downloaded from Python),但在虚拟环境中不是(例如 使用VirtualEnv (v16.7.7),以及(基于进一步研究)Python的 venv)。
我用了Pythonv3.8.0和v3.7.3 作为实验鼠。这是前者的输出:
[cfati@CFATI-5510-0:e:\Work\Dev\Whosebug\q058805040]> "e:\Work\Dev\VEnvs\py_064_03.08.00_test0\Scripts\python.exe" -c "import win32api" Fatal Python error: init_import_size: Failed to import the site module Python runtime state: initialized Traceback (most recent call last): File "e:\Work\Dev\VEnvs\py_064_03.08.00_test0\lib\site.py", line 769, in <module> main() File "e:\Work\Dev\VEnvs\py_064_03.08.00_test0\lib\site.py", line 746, in main paths_in_sys = addsitepackages(paths_in_sys) File "e:\Work\Dev\VEnvs\py_064_03.08.00_test0\lib\site.py", line 279, in addsitepackages addsitedir(sitedir, known_paths) File "e:\Work\Dev\VEnvs\py_064_03.08.00_test0\lib\site.py", line 202, in addsitedir addpackage(sitedir, name, known_paths) File "e:\Work\Dev\VEnvs\py_064_03.08.00_test0\lib\site.py", line 170, in addpackage exec(line) File "<string>", line 1, in <module> File "e:\Work\Dev\VEnvs\py_064_03.08.00_test0\lib\site-packages\win32\lib\pywin32_bootstrap.py", line 14, in <module> for maybe in site.getsitepackages(): AttributeError: partially initialized module 'site' has no attribute 'getsitepackages' (most likely due to a circular import)
注意:我从
经过一番挖掘,发现这是一个 VirtualEnv bug(或者至少,我是这么看的,因为 VirtualEnv 的 site.py 不包含 getsitepackages - 虽然它存在于 Python的site.py自v2.7)。
有几个问题(曾经)围绕这种缺席展开(例如 [GitHub]: pypa/virtualenv - site.getsitepackages() missing), but they appear to be closed without a fix (many of them due to inactivity). Also, [GitHub]: [WIP] The next-gen virtualenv (rewrite),这是一个很大的重构,似乎没有解决它。
Recap: 这个错误(在VirtualEnv上下文):
- 也适用于其他Python版本(我可以确认v3.7.3(32bit ))
- 每次解释器启动时发生
总而言之,不要在 (VirtualEnv) 虚拟环境中安装 PyWin32 226,因为它们最终会处于崩溃状态!
PyWin32(官方.whls)"compatibility table"(没查Anaconda(或其他此类工具)):
- "Normal"(官方)Python 安装:
- v226 是 OK
- VirtualEnvs(还有Python的标准venvs ):
- v225 是 OK
- 对于Python 3.8.0,应该使用[GitHub]: CristiFati/Prebuilt-Binaries - (master) Prebuilt-Binaries/PyWin32/v225
已提交 [GitHub]: mhammond/pywin32 - Workaround for virtual environments (VirtualEnv)(合并于 20191114)。在本地应用更改(查看参考问题以获取有关如何操作的详细信息),修复它:
[cfati@CFATI-5510-0:e:\Work\Dev\Whosebug\q058805040]> sopr.bat *** Set shorter prompt to better fit when pasted in Whosebug (or other) pages *** [prompt]> ".\venv_py_064_030800\Scripts\python.exe" -m pip list Package Version ---------- ------- pip 19.3.1 pywin32 226 setuptools 41.6.0 wheel 0.33.6 [prompt]> ".\venv_py_064_030800\Scripts\python.exe" -c "import win32api" [prompt]>
更新#0
[PyPI]: pywin32 227(解决了这个问题),发表于 20191114!