2014-03-25 45 views
0

当我运行这段代码C&Python集成

./call try1 getByteLength '127 89 89' 

,只接受127作为它的参数,而忽略它的其余部分。 [getByteLength]只是名称我从C.

我使用此代码从蟒蛇官方页面调用蟒蛇功能:

我怎么能这样做呢?

#include <Python.h> 

int main(int argc, char *argv[]) { 
Py_Initialize(); 
    PyRun_SimpleString("import sys"); 
     PyRun_SimpleString("import binascii"); 
     PyRun_SimpleString("sys.path.append(\".\")"); 
     PyObject *pName, *pModule, *pDict, *pFunc; 
     PyObject *pArgs, *pValue; 
     int i; 

     if (argc < 3) { 
      fprintf(stderr,"Usage: call pythonfile funcname [args]\n"); 
      return 1; 
     } 

     //Py_Initialize(); 
     pName = PyString_FromString(argv[1]); 
     /* Error checking of pName left out */ 

     pModule = PyImport_Import(pName); 
     Py_DECREF(pName); 

     if (pModule != NULL) { 
      pFunc = PyObject_GetAttrString(pModule, argv[2]); 
      /* pFunc is a new reference */ 

     if (pFunc && PyCallable_Check(pFunc)) { 
       pArgs = PyTuple_New(argc - 3); 
       for (i = 0; i < argc - 3; ++i) { 
        pValue = PyInt_FromLong((argv[i + 3])); 
        if (!pValue) { 
         Py_DECREF(pArgs); 
         Py_DECREF(pModule); 
         fprintf(stderr, "Cannot convert argument\n"); 
         return 1; 
        } 
        /* pValue reference stolen here: */ 
        PyTuple_SetItem(pArgs, i, pValue); 
      } 
       pValue = PyObject_CallObject(pFunc, pArgs); 
       Py_DECREF(pArgs); 
       if (pValue != NULL) { 
       printf("Result of call: %ld\n", PyInt_AsLong(pValue)); 
       Py_DECREF(pValue); 
       } 
       else { 
        Py_DECREF(pFunc); 
        Py_DECREF(pModule); 
        PyErr_Print(); 
        fprintf(stderr,"Call failed\n"); 
        return 1; 
       } 
     } 
     else { 
      if (PyErr_Occurred()) 
        PyErr_Print(); 
        fprintf(stderr, "Cannot find function \"%s\"\n", argv[2]); 
     } 
      Py_XDECREF(pFunc); 
      Py_DECREF(pModule); 
    } 
    else { 
      PyErr_Print(); 
      fprintf(stderr, "Failed to load \"%s\"\n", argv[1]); 
      return 1; 
    } 
     Py_Finalize(); 
     return 0; 
} 

回答

2

当您使用'127 89 89',这意味着C代码得到一个参数(三个数字的字符串)。

然后调用PyInt_FromLong((argv[i + 3]))这需要第三个参数的地址及管型,为int(地址,它会忽略内容的说法)。这基本上是一个破碎的随机数发生器,不会做你期望或需要的。

您应该改用PyInt_FromString(),并使用pend指针从字符串中的一个数字移动到下一个数字。请注意,您可能必须自行跳过字符串中的空格。

这就是说,我建议使用./call try1 getByteLength 127 89 89(所以你得到每个数字在一个单独的参数),然后使用PyInt_FromString()来解析每个。

+0

“这基本上是一个随机数发生器。” IBTD。你得到的数字是任意的,但远不能用作RNG,因为大部分要求都失败了。 – glglgl

+0

你能举个例子吗? – user2738965

+0

@ user2738965:我不确定你需要什么样的例子。也许你应该在调试器中运行上面的代码,看看它做了什么? –

0

代替PyInt,我使用了PyString。它不需要任何转换。

pValue = PyString_FromString(argv [i + 3]);

其他方法请参考python文档页面。