未找到Python venv模块



我正试图在我的棒上创建一个可移植的venv,将其复制粘贴到某人身上,这样他就不需要在电脑上安装python来运行我的python脚本。我试着在这里搜索解决方案,但也许因为我对python和环境不熟悉,我找不到正确的答案。

我在我的文件夹(Python)中安装了网站上的Python 3.9.1版本,并用它创建了一个环境:

Pythonpyverpy391python -m venv pyenv

在venv中运行where显示:

(pyenv) D:CD_InhaltUpperLimb>where python
D:CD_InhaltUpperLimbPythonpyenvScriptspython.exe

运行我的脚本显示错误:

(pyenv) D:CD_InhaltUpperLimb>UpperLimb.py
Traceback (most recent call last):
File "D:CD_InhaltUpperLimbUpperLimb.py", line 11, in <module>
import c3d
ModuleNotFoundError: No module named 'c3d'

但我知道我安装了c3d:

(pyenv) D:CD_InhaltUpperLimb>pip list
Package         Version
--------------- ---------
appdirs         1.4.4
c3d             0.3.0
certifi         2020.12.5
chardet         4.0.0
...

这台计算机没有安装Python。运行打印(系统路径)显示以下内容:

(pyenv) D:CD_InhaltUpperLimb>python
Python 3.9.1 (tags/v3.9.1:1e5d33e, Dec  7 2020, 17:08:21) [MSC v.1927 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print(sys.path)
['', 'D:\CD_Inhalt\UpperLimb\Python\pyver\py391\python39.zip', 'D:\CD_Inhalt\UpperLimb        
\Python\pyver\py391\DLLs', 'D:\CD_Inhalt\UpperLimb\Python\pyver\py391\lib',     
'D:\CD_Inhalt\UpperLimb\Python\pyver\py391', 'D:\CD_Inhalt\UpperLimb\Python\pyenv', 
'D:\CD_Inhalt\UpperLimb\Python\pyenv\lib\site-packages']

那么,我在哪里犯了错误呢?我很困惑。感谢任何帮助:)问候

编辑1:就像霍夫林提到的那样。如果我写python UpperLimb.py,它就行了。如何将其作为可执行文件直接运行?以前没有python

这是一个XY问题。让我先告诉你如何解决你的问题,然后在附录中解释你面临问题的原因。

1) 解决问题:创建可移植应用程序

你最初的问题出现在第一段:你想与某人共享你的python脚本/应用程序,而不是强迫用户安装python虚拟环境不能解决您的问题。尽管如此,它们是解决方案的部分,因为任何应用程序开发都应该在虚拟环境中进行,以使您的项目隔离。虚拟环境是不可移植的;它们依赖于它们在上创建的机器上的python安装。

如果你想分享你的代码,你有三个不同的选项

(1)创建和可执行
许多人喜欢使用cx_Freeze、pyinstaller或Nuitka等工具从python代码创建可执行文件。不过还是有问题的。这些工具可以很好地与简单的应用程序配合使用,但对于使用大量静态文件、扩展模块(.dlls)或依赖模块的__file__属性访问文件系统上的文件的更大、更复杂的应用程序来说,可能会很麻烦。只需使用工具名在SO上进行简单搜索即可查看一些示例案例。

(2)与可移植python共享代码
有可移植python版本。例如WinPython或Python.org中的Embeddable Python。您可以将它们与应用程序代码和运行python.exe myscript的简单.bat文件打包(使用相对路径)。如果您有外部依赖项(某些软件包),您可以包含它们的.whl文件(从PyPI下载),并让您的.bat也安装它们。我以前用非常复杂的python程序成功地做到了这一点,并将我的程序处理给了对python一无所知的最终用户。不过,这需要一些努力和手工工作。

(3)使用pynsist
另一种方法是对作业使用pynsist。它用于分发python应用程序,但它不会生成单个";myapp.exe";。它所做的基本上是自动化";与可移植python共享代码";。它还创建了一个安装程序,您可以直接处理给您的朋友使用,安装的程序将在Windows"开始"菜单和"已安装的应用程序"中可见。它甚至创建了一个快捷方式,您的用户永远不必自己安装python,甚至不必知道您的应用程序是用python创建的。


附录

关于你所面临问题的一些解释

A1)关于启动python脚本

当您启动python脚本时,通常会键入python myscript.py。发生的情况是,您的操作系统(Windows)将在文件夹列表中搜索python.exe,当它找到它时,它会使用该python.exe来运行脚本。此文件夹列表称为PATH环境变量。

activate脚本(用于powershell的Activate.ps1和用于cmd的activate.bat)的作用是将包含python.exe的虚拟环境的文件夹添加到路径的顶部,因此当您运行时

python myscript.py

将使用虚拟环境中的python.exe(此处为pyenv/Scripts/python.exe),这也保证了可以找到虚拟环境中安装的软件包。

A2)仅运行myscript.py

在Windows上,标准的Python安装程序将.py文件与Python可执行文件相关联。我测试了它,它似乎是用于Windows的特殊Python启动器(py.exe)。所以,当你只是键入

myscript.py

在命令行上,它将作为<full-path-to-py>/py.exe myscript.py运行。如果您只是在文件资源管理器中双击myscript.py,也会发生完全相同的情况。您可以通过右键单击.py文件来更改默认程序->quot;打开方式为"->quot;选择应用程序"->检查";总是使用这个应用程序";,如果你愿意,但这对你的问题没有帮助。

如果您想在以前不使用python的情况下直接运行脚本,那么您必须告诉代码应该使用哪个程序来运行此代码。

假设您在/usr/bin/python上安装了python,那么您必须在python文件中编写要使用的程序。在这种情况下,它是python。

因此,UpperLimb.py文件中的第一行将是#!/usr/bin/python。这一行将告诉程序使用/usr/bin/python中的python程序。

在此之后,您需要使此脚本可执行。您可以使用以下命令使此文件可执行。

$ chmod +x UpperLimb.py

现在,您可以使用命令./UpperLimb.py按如下方式运行此文件

最新更新