ImportError:使用python.org的CPython时没有名为clr的模块

9 投票
4 回答
38515 浏览
提问于 2025-04-30 22:30

我正在写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 个回答

1

这个错误通常是因为你电脑上安装了多个Python版本,而这些版本可能会影响到你的(Windows)系统 PATH变量。当你打开Powershell时,它会根据这个PATH来决定使用哪个Python,具体取决于:

  1. 在(Windows)系统 PATH中的顺序。
    (比如你的Python3.7是在Python3.8之前吗?)
  2. 如果你还安装了其他Python解释器,比如:
    condaminiconda3等,它们也有自己的路径。

然后当你执行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)
1

我在一个代理服务器后面工作,使用多个版本的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
1

你需要在合适的时候,在调用了 Py_Initialize 之后,使用 PySys_SetArgv 来更改系统路径。

19

要安装clr,你需要先安装pythonnet这个库。

你可以使用下面的命令来安装pythonnet。

 pip install pythonnet

撰写回答