运行 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...
祝您代码顺利!
我写了一个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...
祝您代码顺利!