ImportError:使用python.org的CPython时没有名为clr的模块
我正在写C++代码,目的是在里面调用Python脚本。为此,我使用的是来自python.org的CPython。我的一些Python脚本需要通过Python for .NET来执行.NET代码,但一到.NET的部分就出问题了。
我尝试建立一个测试应用程序来确认问题出在哪里,发现它无法导入clr模块。
当我运行这段代码时,出现了ImportError: No module named clr的错误。
Py_Initialize();
PyRun_SimpleString("import clr");
但是如果我打开Python控制台,输入“import clr”,一切都正常。我还检查了sys.path,发现里面有clr.pyd所在的文件夹'C:\Python27\DLLs'。我也尝试在C++中设置这个路径:
char* path = "C:\\Python27\\dlls";
Py_Initialize();
PySys_SetArgv(1, &path);
char* phome = Py_GetPythonHome();
但这并没有解决问题。此外,我不明白为什么clr模块会以clr.pyd的形式出现,而不是像其他编译模块那样是.pyc。
有人能解释一下为什么通过CPython导入clr会失败吗?有没有办法让它正常工作?
4 个回答
这个错误通常是因为你电脑上安装了多个Python版本,而这些版本可能会影响到你的(Windows)系统 PATH变量。当你打开Powershell时,它会根据这个PATH来决定使用哪个Python,具体取决于:
- 在(Windows)系统 PATH中的顺序。
(比如你的Python3.7是在Python3.8之前吗?) - 如果你还安装了其他Python解释器,比如:
conda
、miniconda3
等,它们也有自己的路径。
然后当你执行pip install pythonnet
时,这个包会被安装到系统的包位置,这取决于你使用的是哪个pip。你可以通过pip -V
来检查。
举个例子:
如果你发现你的默认命令行是以conda
激活状态开始的,那么在执行pip install
之前,你需要先执行conda deactivate
。
(base) $ pip -V
pip 20.2.4 from c:\users\xxxx\miniconda3\lib\site-packages\pip (python 3.7)
(base) $ conda deactivate
$ pip -V
pip 20.2.4 from c:\python38\lib\site-packages\pip (python 3.8)
我在一个代理服务器后面工作,使用多个版本的Python。
我有一个批处理文件(bat文件),每当我需要一个新模块,或者想更新一个已有的模块时,就会更新这个文件。
这个文件的第一行设置了我想要更新的Python版本的路径。
这个批处理文件是从脚本目录运行的。
代理的IP地址和端口是“9.254.0.1:81”。
SET path="C:\Programs\Python\Python3_64"
pip install --proxy="9.254.0.1:81" --upgrade pip
pip install --proxy="9.254.0.1:81" pythonnet
你需要在合适的时候,在调用了 Py_Initialize
之后,使用 PySys_SetArgv
来更改系统路径。
要安装clr,你需要先安装pythonnet这个库。
你可以使用下面的命令来安装pythonnet。
pip install pythonnet