将Python字符串作为文件参数传递给子进程

5 投票
1 回答
2310 浏览
提问于 2025-04-17 13:11

我正在尝试把一个文件传给一个程序(MolPro),这个程序是我用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 - 如何通过subprocess.Popen传递字符串(使用stdin参数)?,我还是找不到我哪里出错了。

我更倾向于不:

  • 把字符串写入一个实际的文件
  • 把shell设置为True
  • (而且我不能修改MolPro的代码)

非常感谢任何帮助!

更新:如果有人想做同样的事情,如果你不想等任务完成(因为无论如何它都不会返回任何东西),可以用p.stdin.write(StdinCommand)来代替。

1 个回答

8

看起来你的第二种方法应该可以用,只要把 StdinCommandPopen() 的参数中去掉就行了:

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

撰写回答