运行 虚拟环境中的 python 安装脚本查找全局 Python 安装

Running a python installed script within a virtual environment looks for the global Python installation

我刚刚用 Python 设置了一台新的 Windows 10 机器,现在我遇到了一个我无法理解和修复的奇怪行为(它一直运行良好其他机器)。

我有一个具有以下结构的 Python 项目:

fooProject/
├─ foo_package/
│  ├─ __init__.py
│  ├─ mymodule.py
├─ scripts/
│  ├─ myscript.py
setup.py

这是我的 setup.py 文件的内容:

from setuptools import setup, find_packages

setup(
    name="foo",
    version="0.0.1",
    description="Test package and script",
    packages=find_packages(),
    include_package_data=True,
    classifiers=[
        "Development Status :: 5 - Production/Stable",
        "Topic :: Utilities",
        "License ::",
    ],
    scripts=['scripts/myscript.py']
)

我希望能够从我机器上的任何地方调用脚本,所以我创建了一个虚拟环境 (virtualenv venv),激活它并安装包 (python setup.py install)。

这是我长期以来一直在做的事情,但是在这台机器上,当我 运行 脚本 myscript.py (来自任何地方)时,我遇到以下错误:

(venv) C:\Users\onedey\PycharmProjects\fooProject>myscript.py Traceback (most recent call last):

File "C:\Users\onedey\PycharmProjects\fooProject\venv\Scripts\myscript.py", line 4, in <module> import('pkg_resources').run_script('foo==0.0.1', 'myscript.py')

File "C:\Users\onedey\AppData\Local\Programs\Python\Python38\lib\site-packages\pkg_resources_init_.py", line 3243, in <module> def initialize_master_working_set():

File "C:\Users\onedey\AppData\Local\Programs\Python\Python38\lib\site-packages\pkg_resources_init.py", line 3226, in call_aside f(*args, **kwargs)
File "C:\Users\onedey\AppData\Local\Programs\Python\Python38\lib\site-packages\pkg_resources_init.py", line 3255, in initialize_master_working_set working_set = WorkingSet.build_master()
File "C:\Users\onedey\AppData\Local\Programs\Python\Python38\lib\site-packages\pkg_resources_init.py", line 568, in build_master ws.require(requires)
File "C:\Users\onedey\AppData\Local\Programs\Python\Python38\lib\site-packages\pkg_resources_init.py", line 886, in require needed = self.resolve(parse_requirements(requirements))
File "C:\Users\onedey\AppData\Local\Programs\Python\Python38\lib\site-packages\pkg_resources_init.py", line 772, in resolve raise DistributionNotFound(req, requirers)

pkg_resources.DistributionNotFound: The 'foo==0.0.1' distribution was not found and is required by the application

如您所见,myscript.py 是在 venv/Scripts 文件夹中找到的,但随后在我的全局安装文件夹 (C:\Users\onedey\AppData\Local\Programs\Python\Python38\lib\site-packages) 中搜索了软件包 foo

我尝试搜索类似的问题,但一无所获。

起初 .py 扩展名没有关联到程序(因此它没有启动),所以我将它关联到全局 Python 3.8 安装。

我还尝试配置一些环境变量 - 我认为是 PYTHONHOME 和 PYTHONPATH - 结果很奇怪所以我删除了它们。

我还检查了在虚拟环境中调用 python 是调用正确的 python:

(venv) C:\Users\onedey\PycharmProjects\fooProject>python
Python 3.8.10 (tags/v3.8.10:3d8993a, May  3 2021, 11:48:03) [MSC v.1928 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.executable
'C:\Users\onedey\PycharmProjects\fooProject\venv\Scripts\python.exe'

我也尝试了此 post (Why does subprocess.popen, when run in virtual environment, find the global python executable?) 中提供的命令,实际上我得到了第二种行为:

(venv) C:\Users\onedey\PycharmProjects\fooProject>python
Python 3.8.10 (tags/v3.8.10:3d8993a, May  3 2021, 11:48:03) [MSC v.1928 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys, os, subprocess
>>> sys.executable
'C:\Users\onedey\PycharmProjects\fooProject\venv\Scripts\python.exe'
>>> args = ["python", "-c", "import sys; print(sys.executable)"]
>>> p = subprocess.Popen(args, stdout=None, env=os.environ)
>>> C:\Users\onedey\AppData\Local\Programs\Python\Python38\python.exe

重装并多次修改Python38(这次直接在C:\Python38),尝试了不同的解决方案,终于解决了这个问题。

以下是一些相关问题,可能会对遇到相同问题的其他人有所帮助:

我做的最后一件事是:

  1. 重新设置assoc .py=Python.File对应Python Launcher(之前已经是这样了,不过中间改了提出的方案,没有为我工作)。

这时候还是不行,cmd一直问我要用哪个程序,然后我得到一个闪动的window(script opening then window closing at the end ).

  1. Right-click 在任何 python 脚本上,然后选择“打开方式”和 select“Python 启动器”

  2. 再次打开cmd,激活我的虚拟环境,python myscript.py终于可以使用了!

奇怪的是,我总是检查 Python 安装程序中的“关联 .py 文件”,以及“安装 pylauncher”...