在Python中执行C程序?

22 投票
5 回答
77799 浏览
提问于 2025-04-16 08:10

我有一个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.cspa.h编译成一个可以运行的程序。

如果你在Linux或Mac OS X上使用GCC的话:

$ gcc -Wall spa.c -o spa

这样会生成一个名为spa的可执行文件。

之后,你可以通过你的Python脚本来运行spa程序,方法是:

from subprocess import call
call(["./spa", "args", "to", "spa"])

撰写回答