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
语句。