2012-12-20 41 views
2

PythonCode.py無模塊命名ctypes的使用Python/C API

import os, ctypes 
print "ctypes are imported" 

而且CCode.c

... 
PySys_SetPath(path_to_PythonCode); 
PyObject *pModule = PyImport_ImportModule("PythonCode"); 
if (!pModule) { 
    PyErr_Print(); 
    return; 
} 
... 

PyErr_Print()打印:

Traceback (most recent call last): File ".../PythonCode.py", line 1, 
    in <module> import os, ctypes 
ImportError: No module named ctypes 

在終端中執行Python代碼人表明確實存在的ctypes:

$ python --version 
Python 2.7.1 
$ python PythonCode.py 
ctypes are imported 

爲什麼的Python/C API無法導入ctypes的?

+3

這看起來像Python中經典的循環導入問題,只能通過C到達那裏。您嘗試在C中導入Python模塊,但Python模塊試圖將C庫作爲ctypes的一部分導入,因此您最終在解釋器有機會完全構建它之前嘗試從sys.modules獲取ctypes,因爲C代碼仍在執行中。這並不是說它不存在,而是在您嘗試在您的程序流中訪問它的時候,模塊的狀態不完整,因此無論是卸載還是無法加載。 –

+3

您用單個路徑替換了默認的'sys.path'列表。相反,你可以追加或插入新的路徑:'PyObject * sysPath = PySys_GetObject(「path」); PyObject * path = PyString_FromString(path_to_PythonCode); PyList_Append(sysPath,path); //或PyList_Insert(sysPath,0,path);'(需要錯誤處理)。 – eryksun

+1

@eryksun:謝謝!這就是訣竅!你爲什麼回答評論? – AlexP

回答

4

您用單一路徑替換了默認的sys.path列表。相反,你可以插入新的路徑:

PyObject *sys_path, *path; 

sys_path = PySys_GetObject("path"); 
if (sys_path == NULL || !PyList_Check(sys_path)) { 
    /* ZOMG! That's so wrong... */ 
    return; 
} 
path = PyString_FromString(path_to_PythonCode); 
PyList_Insert(sys_path, 0, path); 
Py_DECREF(path);