我想將一個文件傳遞給一個程序(MolPro),我使用Python作爲子進程啓動。Python字符串作爲子進程的文件參數
它最常見的需要一個文件作爲參數,這樣在控制檯:
path/molpro filename.ext
凡filename.ex包含要執行的代碼。另外一個bash腳本(我想要做的,但在Python):
#!/usr/bin/env bash
path/molpro << EOF
# MolPro code
EOF
我試圖做上述Python編寫的。我曾經嘗試這樣做:
from subprocess import Popen, STDOUT, PIPE
DEVNULL = open('/dev/null', 'w') # I'm using Python 2 so I can't use subprocess.DEVNULL
StdinCommand = '''
MolPro code
'''
# Method 1 (stdout will be a file)
Popen(['path/molpro', StdinCommand], shell = False, stdout = None, stderr = STDOUT, stdin = DEVNULL)
# ERROR: more than 1 input file not allowed
# Method 2
p = Popen(['path/molpro', StdinCommand], shell = False, stdout = None, stderr = STDOUT, stdin = PIPE)
p.communicate(input = StdinCommand)
# ERROR: more than 1 input file not allowed
所以我敢肯定輸入看起來並不足夠像一個文件,但即使看着Python - How do I pass a string into subprocess.Popen (using the stdin argument)?我找不到什麼林做錯了。
我不喜歡:
- 寫入字符串到實際文件
- 組外殼爲True
- (我不能改變MOLPRO代碼)
謝謝很多幫助!
更新:如果有人試圖做同樣的事情,如果您不想等待工作完成(因爲它不會返回任何內容),請改爲使用p.stdin.write(StdinCommand)
。
爲什麼你想提供文本的大規模塊,'實際的命令行上StdinCommand'?方法2提供了stdin上的文本。你爲什麼要在命令行重複它? – 2012-02-17 19:46:52
由於我一直忽略了一個小時左右的錯誤...... :-) – Mark 2012-02-17 19:55:18