2012-02-17 21 views
3

我想將一個文件傳遞給一個程序(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)

+2

爲什麼你想提供文本的大規模塊,'實際的命令行上StdinCommand'?方法2提供了stdin上的文本。你爲什麼要在命令行重複它? – 2012-02-17 19:46:52

+0

由於我一直忽略了一個小時左右的錯誤...... :-) – Mark 2012-02-17 19:55:18

回答

8

好像如果從Popen()參數刪除StdinCommand你的第二個方法應該工作:

p = Popen(['/vol/thchem/x86_64-linux/bin/molpro'], shell = False, stdout = None, stderr = STDOUT, stdin = PIPE) 
p.communicate(input = StdinCommand) 
+0

我可能因爲沒有看到:-)而被推遲,感謝您的快速回復! – Mark 2012-02-17 19:54:36