【问题标题】:embedding python module error嵌入python模块错误
【发布时间】:2012-01-19 15:49:49
【问题描述】:

所以我有一个 c 到 python 的包装器,它接受输入字符串并将它们传递给 python 函数。我得到的错误是python API无法识别我的python文件......

PyObject *pName, *pModule, *pFunc;
QString pyFile="Test.py";
Py_Initialize();
pName = PyUnicode_FromString(pyFile.toAscii().data());
pModule = PyImport_Import(pName);

错误是“ImportError:没有名为 Test.py 的模块” 这是当我的 Test.py 与我的项目位于同一目录中时

当我将我的 Test.py 放在我的目录树中的一级时,出现了另一个错误 错误是“不支持按文件名导入”

所以我猜绝对路径不起作用?但是在我的示例中的第一种情况下,我清楚地将我的 Test.py 放在与我的项目相同的目录中,为什么会出现错误? python代码是:

import sys
import os

def printFileClass(fileName, className):
    print ("The OMC CORBA File name is ", fileName,"\n")
    print ("The selected Modelica Class is ", className)
    return ("Done operations")


def main():
    print ("Hello! Here is testing script's main \n")



if __name__=='__main__':
main()

【问题讨论】:

  • 我强烈建议不要对任何 python 模块或脚本使用名称“test”。有一个具有该名称的内置模块,创建自己的模块总是会导致问题。尝试在导入时从模块名称中删除“.py”。
  • 所以我只尝试了测试,但它给了我同样的错误... =(

标签: python file python-module python-c-api


【解决方案1】:

PYTHONPATH 环境变量可用于解决您的问题。

在您的代码中,您可以在 Py_Initialize() 之前的某个地方执行此操作:

setenv("PYTHONPATH", ".", 0); // #include <stdlib.h> to get the prototype

第三个参数 0 表示覆盖 - 它为零,因此您也可以从 shell 传递 PYTHONPATH。如果您想始终使用您编码的路径,可以将其设置为 1。

我不确定这不会让您遇到其他问题,但对于一个简单的测试来说它是有效的。

另外,不要在传递给 PyImport_Import 的模块名称中包含 .py 扩展名。

我在 Linux 系统上对此进行了测试。

【讨论】:

  • 刚刚浏览文档,Python.h 已经为您包含了 stdlib.h。
【解决方案2】:

在第一种情况下确实没有名为“Test.py”的模块。您的模块在文件“Test.py”中被命名为“Test”。尝试导入。 “Test.py”将是名为“Test”的包中的“py”子模块。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-14
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多