【发布时间】:2012-02-20 04:55:46
【问题描述】:
我正在尝试在 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
【问题讨论】:
-
如果
segment.sh实际上是打开您提供的文件名并读取其内容,并且不支持从标准输入读取,那么不幸的是,您将不得不要么将文本保存到文件,要么修改segment.sh。这就是 Unix 编程的理念之一:让每个程序都能够像过滤器一样运行——换句话说,能够从标准输入读取并写入标准输出。 -
感谢您的评论,@voithos。 segment.sh 脚本本身正在调用 java 程序: JAVACMD="java -mx2g -cp $BASEDIR/seg.jar edu.stanford.nlp.ie.crf.CRFClassifier -sighanCorporaDict $DATADIR -testFile $file -inputEncoding $enc -sighanPostProcessing true $ARGS"。所以,我不确定这个程序是否可以接受除了文件之外的标准输入。请指教。
-
同样的观点成立。您的脚本正在运行的 Java 程序需要能够从标准输入中读取。看起来你在这里反对你的工具。不幸的是,并非所有程序都是在考虑标准输入/输出的情况下编写的。但是只使用文件有问题吗?只需在文件而不是变量上运行
pySegment,然后打开分段文件并读取它。 -
尝试将
-作为文件名传递。如果-作为文件名传递,则从标准输入读取是一种常见的约定。 -
如果
./segment.sh有#!/bin/bashshebang 并且它是可执行的 (chmod +x segment.sh),你可以删除/bin/bash
标签: python shell variables subprocess pipe