2016-07-15 32 views
0

私はPython 3.3を使用しています。 私はC++ Qtコードを使用しており、Pythonをその中に埋め込んでいます。 Python 3のC Python APIを使用して1つのPythonファイルを実行したい。C++コードから実行するPythonファイル

以下は、ファイルを読み込んでQtを使用して実行するサンプルコードです。

FILE *cp = fopen("/tmp/my_python.py", "r"); 
if (!cp) 
{   
    return; 
} 

Py_Initialize(); 

// Run the python file 
#ifdef PYTHON2 
PyObject* PyFileObject = PyFile_FromString("/tmp/my_python.py", (char *)"r"); 
if (PyRun_SimpleFile(PyFile_AsFile(PyFileObject), "/tmp/my_python.py") != 0) 
    setError(tr("Failed to launch the application server, server thread exiting.")); 

#else 
int fd = fileno(cp); 
PyObject* PyFileObject = PyFile_FromFd(fd, "/tmp/my_python.py", (char *)"r", -1, NULL, NULL,NULL,1); 
if (PyRun_SimpleFile(fdopen(PyObject_AsFileDescriptor(PyFileObject),"r"), "/tmp/my_python.py") != 0) 
    setError(tr("Failed to launch the application server, server thread exiting.")); 
#endif 
Py_Finalize(); 

Python2ではすべて正常に動作しています。しかし、python3(#elseパート)はウィンドウの下では動作しません。アプリケーションがクラッシュしています。私は行ごとに読んで実行したくありません。

Python3を使ってC++アプリケーションでpythonファイルを実行する方法を教えていただけますか?いくつかの疑似コードやリンクが役立ちます。

ありがとうございました。

+0

なぜあなたは単に 'cp'を渡す代わりに、巧妙になろうとしていませんか? –

+0

あなたは "if(PyRun_SimpleFile(cp、" /tmp/my_python.py "))を呼び出すと言っていますか?これは私も同じ結果を試しましたが、 – Neel

+0

https://docs.python.org/3/c- api/veryhigh.html#c.PyRun_SimpleFile –

答えて

1

次のテストプログラムは、FILEポインタを直接渡して正常に動作します。 Fedoraの23でコンパイル

runpy.c

#include <stdio.h> 
#include <Python.h> 

int main(int argc, char** argv) 
{ 
    if (argc != 2) 
    { 
    printf("Usage: %s FILENAME\n", argv[0]); 
    return 1; 
    } 
    FILE* cp = fopen(argv[1], "r"); 
    if (!cp) 
    { 
    printf("Error opening file: %s\n", argv[1]); 
    return 1; 
    } 

    Py_Initialize(); 

    int rc = PyRun_SimpleFile(cp, argv[1]); 
    fclose(cp); 

    Py_Finalize(); 
    return rc; 
} 

と:

g++ -W -Wall -Wextra -I/usr/include/python3.4m -o runpy runpy.c -lpython3.4m 
関連する問題