从Python调用C&#hello world

时间:2016-10-14 00:01:26

标签: python c rodeo

我的C脚本:

/* Hello World program */

#include <stdio.h>

int main() {
   printf("Hello, World! \n");
   return 0;
}

我希望以{strong>最简单的方式直接在我的Python IDE(Rodeo IDE)中打印Hello, World!

到目前为止,我已经提出了以下方法,但它似乎不起作用(并且因为它需要我去终端而有点麻烦):

首先,我在终端中gcc helloworld.c生成可执行文件a.out*,然后我这样做:

from subprocess import call
call(["./a.out"])

但不是将Hello, World!打印到Python控制台,而是获得0(这意味着成功)。我怎样才能将C输出直接打印直接到Python控制台,我怎样才能更简化它(例如避免终端绕行)?我知道我需要先创建可执行文件(这就是我使用终端的原因)但是在Python IDE中可能有更简洁的方法吗?

让用户感到惊讶的是......为了解释b

Python 3.5.2 |Anaconda 4.2.0 (x86_64)| (default, Jul 2 2016, 17:52:12) [GCC 4.2.1 Compatible Apple LLVM 4.2 (clang-425.0.28)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import subprocess >>> print(subprocess.check_output("./a.out")) b'Hello, World! \n'

b来自......

,这很奇怪

3 个答案:

答案 0 :(得分:4)

>>> import subprocess
>>> subprocess.check_output("./a.out")
'Hello World!\n'

关于你的第二个问题,你也可以使用子进程调用gcc。在这种情况下,调用可能是正确的选择,因为你可能想在运行a.out之前检查失败。

这是一个完整的脚本:

import subprocess
status = subprocess.call(["gcc","hello.c"])
if status == 0:
   print(subprocess.check_output("./a.out").decode('utf-8'))
else:
   print("Failed to compile")

的hello.c:

#include "stdio.h"
int main() {
   printf("Hello world!"); 
}

输出: 你好世界!

答案 1 :(得分:4)

如果您编译C脚本(例如,编译到a.out):

#include <stdio.h>

int main(void) {
   printf("Hello, World! \n");
   return 0;
}

您可以使用CTypes轻松调用它:

# hello.py
import ctypes

beach = "./a.out"
seashell = ctypes.cdll.LoadLibrary(beach)

seashell.main()

调用以下Python脚本将在C脚本中调用main()

$ python hello.py
Hello, World!

您可以使用例如communicate对子输出进行子处理和捕获,但不需要生成一个shell来完成您所需的操作。

答案 2 :(得分:-2)

您可以使用以下代码将文本正确打印到Python模块:

print("Hello, world!")