我想从C调用Python脚本,传递脚本中需要的一些参数.
我想要使用的脚本是mrsync或多播远程同步.我从命令行开始工作,通过调用:
python mrsync.py -m /tmp/targets.list -s /tmp/sourcedata -t /tmp/targetdata
Run Code Online (Sandbox Code Playgroud)
-m是包含目标ip-addresses的列表.-s是包含要同步的文件的目录.-t是目标计算机上放置文件的目录.
到目前为止,我通过使用以下C程序设法运行没有参数的Python脚本:
Py_Initialize();
FILE* file = fopen("/tmp/myfile.py", "r");
PyRun_SimpleFile(file, "/tmp/myfile.py");
Py_Finalize();
Run Code Online (Sandbox Code Playgroud)
这很好用.但是,我无法找到如何将这些参数传递给该PyRun_SimpleFile(..)方法.
Mik*_*ike 38
看起来你正在寻找使用Python.h中的python开发API的答案.以下是适合您的示例:
#My python script called mypy.py
import sys
if len(sys.argv) != 2:
sys.exit("Not enough args")
ca_one = str(sys.argv[1])
ca_two = str(sys.argv[2])
print "My command line args are " + ca_one + " and " + ca_two
Run Code Online (Sandbox Code Playgroud)
然后是传递这些args的C代码:
//My code file
#include <stdio.h>
#include <python2.7/Python.h>
void main()
{
FILE* file;
int argc;
char * argv[3];
argc = 3;
argv[0] = "mypy.py";
argv[1] = "-m";
argv[2] = "/tmp/targets.list";
Py_SetProgramName(argv[0]);
Py_Initialize();
PySys_SetArgv(argc, argv);
file = fopen("mypy.py","r");
PyRun_SimpleFile(file, "mypy.py");
Py_Finalize();
return;
}
Run Code Online (Sandbox Code Playgroud)
如果您可以将参数传递给C函数,则此任务变得更加容易:
void main(int argc, char *argv[])
{
FILE* file;
Py_SetProgramName(argv[0]);
Py_Initialize();
PySys_SetArgv(argc, argv);
file = fopen("mypy.py","r");
PyRun_SimpleFile(file, "mypy.py");
Py_Finalize();
return;
}
Run Code Online (Sandbox Code Playgroud)
你可以直接通过.现在我的解决方案只是为了时间而使用了2个命令行参数,但是你可以对你需要传递的所有6个使用相同的概念...当然还有更简洁的方法来捕获python方面的args,但是这只是基本的想法.
希望能帮助到你!
你有两个选择.
呼叫
system("python mrsync.py -m /tmp/targets.list -s /tmp/sourcedata -t /tmp/targetdata")
Run Code Online (Sandbox Code Playgroud)
在你的C代码中.
实际上使用mrsync(希望)定义的API .这更灵活,但更复杂.第一步是弄清楚如何在Python函数调用中执行上述操作.如果mrsync编写得很好,就会有一个函数mrsync.sync(比如说)
mrsync.sync("/tmp/targets.list", "/tmp/sourcedata", "/tmp/targetdata")
Run Code Online (Sandbox Code Playgroud)
一旦你弄清楚如何做到这一点,你可以使用Python API直接从C代码调用该函数.
| 归档时间: |
|
| 查看次数: |
24422 次 |
| 最近记录: |