在Python中执行C程序?
我有一个C语言程序,至少我认为它是(文件:spa.c,spa.h)。有没有办法让我从Python执行这个脚本,而不需要给Python解释器传递额外的参数?如果不行,那需要传什么参数呢?
更新:感谢大家的回复。源代码可以在这里找到:http://www.nrel.gov/midc/spa/#register
(请不要被网址中的“注册”吓到,如果你填写表格,就可以立即下载文件(没有验证邮件等)。我会尝试你们的建议,并反馈结果。
更新 2:我用gcc编译了源代码,但现在在调用时给我权限被拒绝的错误,即使我以root身份运行Python(我在使用Ubuntu 10:10)。
更新 3 [错误号 8] 执行格式错误
更新 4 好的,我让它工作了。程序通过printf输出值:
>>> call(['/path'])
Julian Day: 2452930.312847
L: 2.401826e+01 degrees
B: -1.011219e-04 degrees
R: 0.996542 AU
H: 11.105902 degrees
Delta Psi: -3.998404e-03 degrees
Delta Epsilon: 1.666568e-03 degrees
Epsilon: 23.440465 degrees
Zenith: 50.111622 degrees
Azimuth: 194.340241 degrees
Incidence: 25.187000 degrees
Sunrise: 06:12:43 Local Time
Sunset: 17:20:19 Local Time
谢谢大家!
5 个回答
5
C 不是一种脚本语言。你需要把 spa.c 编译成一个可执行文件。你没有说明你的操作系统,但如果是 Mac 或 Linux,可以试试
gcc spa.c -o spa
如果这样成功了,你就会得到一个名为 spa 的可执行文件。你可以使用 Python 的 os.system()
来调用它。
14
cinpy 是一个很棒的工具,它结合了 tcc 和 ctypes 的优点,效果非常不错。
下面的代码是从这个包里的 cinpy_test.py 文件中提取出来的。
import ctypes
import cinpy
# Fibonacci in Python
def fibpy(x):
if x<=1: return 1
return fibpy(x-1)+fibpy(x-2)
# Fibonacci in C
fibc=cinpy.defc("fib",
ctypes.CFUNCTYPE(ctypes.c_long,ctypes.c_int),
"""
long fib(int x) {
if (x<=1) return 1;
return fib(x-1)+fib(x-2);
}
""")
# ...and then just use them...
# (there _is_ a difference in the performance)
print fibpy(30)
print fibc(30)
56
其实没有什么叫做C脚本的东西。如果你是想说C程序,那么你需要先把spa.c
和spa.h
编译成一个可以运行的程序。
如果你在Linux或Mac OS X上使用GCC的话:
$ gcc -Wall spa.c -o spa
这样会生成一个名为spa
的可执行文件。
之后,你可以通过你的Python脚本来运行spa
程序,方法是:
from subprocess import call
call(["./spa", "args", "to", "spa"])