在Python中执行C程序?

22
我有一个C程序(文件:spa.c,spa.h),我想知道是否有办法在Python中执行此脚本而不传递额外的参数给Python解释器(如果不行,这些参数是什么?)。 更新:感谢您们的回复。源代码可以在http://www.nrel.gov/midc/spa/#register找到。
(请不要被URL中的“register”吓倒,如果你填写表单,你可以立即下载文件(没有验证邮件等)。)我会尝试您的建议,并报告结果。 更新2:我使用gcc编译了源代码,但是现在当我尝试调用时(即使以root身份运行python),它给我一个拒绝访问的权限错误(我正在Ubuntu 10:10上)。 更新3 [Errno 8] Exec format error。 更新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

谢谢大家!


你能在这里发布一些你的spa.c代码片段(或者最好是整个代码)吗?虽然有一些类似C的脚本实现,但通常C是一种编译语言。即使你找到了一些用Python编写的C解释器,让任意C程序在其中工作的机会非常渺茫。 - atzz
据我所知,目前没有任何参数可以将 Python 解释器转换为 C 编译器。但是,您可以使用 Python ctypes 从动态链接库或共享库中运行 C 代码。 - Mikhail Churbanov
5个回答

55

并不存在所谓的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"])

args应该是带有参数的字符串吗?例如:args =“--option for my program” - Sigur
如果确实需要选项为多个参数,则使用call(["your program", "--option", "for", "my", "program"])。也许你的意思是call(["your program", "--option", "for my program"]),但只有你自己知道。 - tripleee

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)

有人知道在哪里可以下载 'cinpy' 吗?原始的 URL 不再可用。 - OGP
好的,已在网页存档中找到。 - OGP
虽然cinpy看起来已经没有维护了,但它是一个非常实用的工具。软件包可以从这里获取:https://github.com/csarn/cinpy。使用指南可以在这里找到:http://amundblog.blogspot.com/2008/12/cinpy-or-c-in-python.html。 - Ivy Growing

5

C不是一种脚本语言,你需要将spa.c编译成可执行文件。不知道你使用的操作系统是哪个,但如果是Mac或Linux,请尝试:

  gcc spa.c -o spa

如果这个方法可行,你现在会有一个名为 spa 的可执行文件。你可以使用 Python 的 os.system() 来调用它。


4

没有所谓的C 脚本,您需要编译C程序...如果编译成可执行文件,则可以使用os.system(CommandLine)来执行它。


1
你应该优先选择使用subprocess而不是os.system() - tripleee
@tripleee 为什么?我很好奇。 - maynouf
@tripleee 为什么?我很好奇。 - undefined
1
因为这是 os.system 文档推荐的做法。详细原因请参考 https://www.python.org/dev/peps/pep-0324/。 - tripleee
1
因为这是os.system文档推荐的做法。请参考https://www.python.org/dev/peps/pep-0324/了解更详细的原因。 - undefined

2

虽然这个问题很老,但我觉得还缺少一个重要的部分!

C 代码可以在 Python 脚本中编译和执行:

#include <iostream>
using namespace std;
int main(){
cout<<"Hello World\n";
return 1;
}



import subprocess
subprocess.call(["g++", "hello_world.cpp"]) # OR gcc for c program
tmp=subprocess.call("./a.out")
print("printing result")
print(tmp)


$ python main.py 
Hello World
printing result
1

我参考了Quora上的帖子:https://www.quora.com/How-do-I-write-a-Python-script-to-run-a-C-program


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接