aih*_*ang 4 python variables shell subprocess pipe
我试图在python中调用shell脚本(segment.sh).在控制台上生成正确结果的语法是:
> ./segment.sh ctb file.txt utf-8 0
Run Code Online (Sandbox Code Playgroud)
可以看出,这个shell脚本需要一个文本文件作为输入.我想要做的是打开文件并在python中读取其内容(稍后最好从HTML POST表单),并以某种方式将包含内容的变量传递给python子进程调用.
以下功能无效.但是如果我只是提供一个文件名,例如:
Popen(["/bin/bash", "./segment.sh", "ctb", "file.txt", "utf-8", "0"])`
Run Code Online (Sandbox Code Playgroud)
然后,它会工作,但我想从变量传递输入.你能给我一些指示吗?
def pySegment(text):
op = subprocess.Popen(["/bin/bash", "./segment.sh", "ctb", "utf-8", "0"],
stdout = subprocess.PIPE,
stdin = subprocess.PIPE,
stderr = subprocess.STDOUT,
)
results = op.communicate(input=text)[0]
return results
if __name__ == "__main__":
filename = "./file.txt"
text = open(filename).read()
result = pySegment(text)
print result
Run Code Online (Sandbox Code Playgroud)
我建议使用命名管道:
import os, tempfile, shutil, subprocess
temp_dir = tempfile.mkdtemp()
filename = os.path.join(temp_dir, 'file.txt')
text = '<text>'
os.mkfifo(filename)
try:
subprocess.Popen(('segment.sh', 'ctf', filename, 'utf-8', '0'))
with open(filename, 'w') as f:
f.write(text)
finally:
shutil.rmtree(temp_dir)
Run Code Online (Sandbox Code Playgroud)
命名管道将提供相同的文件接口,而无需根据需要真正创建该文件.