Python:子进程调用中的替换

Python:子进程调用中的替换,python,subprocess,Python,Subprocess,我对范围内(…)执行:,我需要在子流程调用中替换I。我试着这样做: myStr = "'(insert \"%g\")'" %i subprocess.Popen(["emacs", "--batch", "+83:28", "md.mdp", "--eval", eval("myStr"), "-f", "save-buffer", "--kill"], stdout=subprocess.PIP

我对范围内(…)执行
,我需要在子流程调用中替换
I
。我试着这样做:

myStr = "'(insert \"%g\")'" %i
    subprocess.Popen(["emacs", "--batch", "+83:28", "md.mdp", "--eval", 
                      eval("myStr"), "-f", "save-buffer", "--kill"], 
                     stdout=subprocess.PIPE).wait()
subprocess.Popen(["emacs", "--batch", "+83:28", "md.mdp", "--eval", 
                  "'(insert \"%g\")'" %i, "-f", "save-buffer", "--kill"], 
                 stdout=subprocess.PIPE).wait()
subprocess.Popen(["emacs", "--batch", "+83:28", "md.mdp", "--eval", 
                  ("'(insert \"%g\")'" %i), "-f", "save-buffer", "--kill"], 
                 stdout=subprocess.PIPE).wait()
就像这样:

myStr = "'(insert \"%g\")'" %i
    subprocess.Popen(["emacs", "--batch", "+83:28", "md.mdp", "--eval", 
                      eval("myStr"), "-f", "save-buffer", "--kill"], 
                     stdout=subprocess.PIPE).wait()
subprocess.Popen(["emacs", "--batch", "+83:28", "md.mdp", "--eval", 
                  "'(insert \"%g\")'" %i, "-f", "save-buffer", "--kill"], 
                 stdout=subprocess.PIPE).wait()
subprocess.Popen(["emacs", "--batch", "+83:28", "md.mdp", "--eval", 
                  ("'(insert \"%g\")'" %i), "-f", "save-buffer", "--kill"], 
                 stdout=subprocess.PIPE).wait()
也像这样:

myStr = "'(insert \"%g\")'" %i
    subprocess.Popen(["emacs", "--batch", "+83:28", "md.mdp", "--eval", 
                      eval("myStr"), "-f", "save-buffer", "--kill"], 
                     stdout=subprocess.PIPE).wait()
subprocess.Popen(["emacs", "--batch", "+83:28", "md.mdp", "--eval", 
                  "'(insert \"%g\")'" %i, "-f", "save-buffer", "--kill"], 
                 stdout=subprocess.PIPE).wait()
subprocess.Popen(["emacs", "--batch", "+83:28", "md.mdp", "--eval", 
                  ("'(insert \"%g\")'" %i), "-f", "save-buffer", "--kill"], 
                 stdout=subprocess.PIPE).wait()
但这些都不管用。你能帮我把它做好吗

另外,当
系统(“bash命令”)
不会
等待时,这是真的吗

编辑

脚本可以对给定参数的各种值运行计算机模拟。它为每次运行复制baseData目录,然后转到那里,更改参数文件(插入值),然后应该运行模拟并返回

这不会产生错误-但也不会在
md.mdp
中插入
i
的值:

myStr = "'(insert \"%g\")'" %i
subprocess.Popen(["emacs", "--batch", "+83:28", "md.mdp", "--eval", 
                  myStr, "-f", "save-buffer", "--kill"], 
                 stdout=subprocess.PIPE).wait()
这也无助于:

myStr = "'(insert \\\"%g\\\")'" %i
以下变体也不会插入任何内容:

subprocess.Popen(["emacs", "--batch", "+83:28", "md.mdp", "--eval", 
              "'(insert \"%g\")'" %i, "-f", "save-buffer", "--kill"], 
             stdout=subprocess.PIPE).wait()

subprocess.Popen(["emacs", "--batch", "+83:28", "md.mdp", "--eval", 
              ("'(insert \"%g\")'" %i), "-f", "save-buffer", "--kill"], 
             stdout=subprocess.PIPE).wait()

我想说的是,问题在于您不需要引用
insert
语句部分。原因是在shell中使用引号可以清楚地表明引号之间的字符串将作为单个参数传递

但是,在
subprocess.Popen
中,您使用数组来执行相同的功能,因此不需要引号。换句话说,在shell中,引号不会传递给正在启动的进程,而在
subprocess.Popen
调用中,引号会被传递。

以下操作有效:

subprocess.Popen(["emacs", "--batch", "+83:28", "md.mdp", "--eval", 
                 eval("'(insert \"%g\")'" %i), "-f", "save-buffer", "--kill"], 
                 stdout=subprocess.PIPE).wait()
编辑1

有时你不需要评估:

subprocess.Popen(["grompp", "-f", "%s" %opts.myMdp, "-c", "%s" %opts.myGro,
                 "-p", "%s" %opts.myTop], stdout=subprocess.PIPE).wait()
编辑2

当我执行
”(插入\%g\”)时,'%I
会给出

Traceback (most recent call last): File
"/home/boris/its/plts/bio/bk-simulates-work.py", line 100, in <module>

subprocess.Popen(["emacs", "--batch", "+83:28", "md.mdp", "--eval",
'(insert \"%g\")' %i, "-f", "save-buffer", "--kill"],
stdout=subprocess.PIPE).wait() 

NameError: name 'i' is not defined
它只插入%g

实际上,我不再使用emacs(在文件中的特定位置插入I):

myInput = open(opts.myMdp, 'r')
myTempFile = opts.myMdp + '~~~'
myOutput = open(myTempFile, 'w')
for line in myInput:
    myOutput.write(line.replace(opts.myToken, "%g" %myValue))
myOutput.close()
myInput.close()
os.rename(myTempFile, opts.myMdp)

你能准确地粘贴替换时得到的内容吗?你的答案基本上是从字符串中删除引号。还有什么不同吗?我想试试你的方法。请您指定我应该使用什么:
“'(插入\%g\””””%I
this或
'(插入\%g\”)“%I
this-或其他什么?您应该直接使用
”(插入\%g\”
)。请注意,
eval(“'(insert\%g\””)”%i)='(insert\%g\”%i
,因此不需要
eval
语句。