运行 python 程序中的 C 可执行文件

Running a C executable inside a python program

我写了一个C code,其中我将一种文件格式转换为另一种文件格式。对于 运行 我的 C code,我使用了一个命令行参数:filestem.

我执行该代码使用:./executable_file filestem > outputfile

我在 outputfile

中得到了我想要的输出

现在我想在 python 代码中获取该可执行文件和 运行。

我正在尝试:

import subprocess
import sys
filestem = sys.argv[1];
subprocess.run(['/home/dev/executable_file', filestem , 'outputfile'])

但是无法创建outputfile。我认为应该添加一些东西来解决 > 问题。却想不通。请帮忙

subprocess.run 有可选的 stdout 参数,你可以给它文件句柄,所以在你的情况下像

import subprocess
import sys
filestem = sys.argv[1]
with open('outputfile','wb') as f:
    subprocess.run(['/home/dev/executable_file', filestem],stdout=f)

应该可以。我没有能力测试它所以请 运行 它并写下它是否按预期工作

您有多种选择:

NOTE - Tested in CentOS 7, using Python 2.7

1. 尝试 pexpect:

"""Usage: executable_file argument ("ex. stack.py -lh")"""
import pexpect

filestem = sys.argv[1]
# Using ls -lh >> outputfile as an example
cmd = "ls {0} >> outputfile".format(filestem)
command_output, exitstatus = pexpect.run("/usr/bin/bash -c '{0}'".format(cmd), withexitstatus=True)
if exitstatus == 0:
    print(command_output)
else:
    print("Houston, we've had a problem.")

2. 运行 subprocess with shell=true (不推荐):

"""Usage: executable_file argument ("ex. stack.py -lh")"""
import sys
import subprocess

filestem = sys.argv[1]
# Using ls -lh >> outputfile as an example
cmd = "ls {0} >> outputfile".format(filestem)
result = subprocess.check_output(shlex.split(cmd), shell=True)  # or subprocess.call(cmd, shell=True)
print(result)

它有效,但是 python.org 不赞成这样做,因为有 shell 注入的机会:参见 "Security Considerations" in the subprocess documentation.

3. 如果必须分别使用subprocess、运行每个命令,将前一个命令的SDTOUT通过管道传输到STDIN下一个命令:

p = subprocess.Popen(cmd, stdin=PIPE, stdout=PIPE)
stdout_data, stderr_data = p.communicate()
p = subprocess.Popen(cmd, stdin=stdout_data, stdout=PIPE)
etc...

祝您代码顺利!