运行 虚拟环境中的 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),尝试了不同的解决方案,终于解决了这个问题。
以下是一些相关问题,可能会对遇到相同问题的其他人有所帮助:
- https://bugs.python.org/issue40253
- How to associate Python scripts with active virtualenv?
我做的最后一件事是:
- 重新设置
assoc .py=Python.File
对应Python Launcher(之前已经是这样了,不过中间改了提出的方案,没有为我工作)。
这时候还是不行,cmd一直问我要用哪个程序,然后我得到一个闪动的window(script opening then window closing at the end ).
Right-click 在任何 python 脚本上,然后选择“打开方式”和 select“Python 启动器”
再次打开cmd,激活我的虚拟环境,python myscript.py
终于可以使用了!
奇怪的是,我总是检查 Python 安装程序中的“关联 .py 文件”,以及“安装 pylauncher”...
我刚刚用 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),尝试了不同的解决方案,终于解决了这个问题。
以下是一些相关问题,可能会对遇到相同问题的其他人有所帮助:
- https://bugs.python.org/issue40253
- How to associate Python scripts with active virtualenv?
我做的最后一件事是:
- 重新设置
assoc .py=Python.File
对应Python Launcher(之前已经是这样了,不过中间改了提出的方案,没有为我工作)。
这时候还是不行,cmd一直问我要用哪个程序,然后我得到一个闪动的window(script opening then window closing at the end ).
Right-click 在任何 python 脚本上,然后选择“打开方式”和 select“Python 启动器”
再次打开cmd,激活我的虚拟环境,
python myscript.py
终于可以使用了!
奇怪的是,我总是检查 Python 安装程序中的“关联 .py 文件”,以及“安装 pylauncher”...