如何向需要文件名而非变量的Python子进程调用提供输入?

4 投票
1 回答
3603 浏览
提问于 2025-04-17 11:12

我想在Python中调用一个shell脚本(segment.sh)。在控制台上能正确运行的语法是:

> ./segment.sh ctb file.txt utf-8 0

从上面的内容可以看出,这个shell脚本需要一个文本文件作为输入。我想做的是在Python中打开这个文件,读取它的内容(以后可能是通过HTML的POST表单来获取),然后把包含内容的变量传递给Python的子进程调用。

下面这个函数现在不工作。但是如果我直接提供一个文件名,比如:

Popen(["/bin/bash", "./segment.sh", "ctb", "file.txt", "utf-8", "0"])`

这样是可以的,但我想通过一个变量来传递输入。你能给我一些建议吗?

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

1 个回答

5

我建议使用一个命名管道

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)

命名管道会提供一个和文件一样的使用方式,但实际上并不会真的创建那个文件。

撰写回答