Python: подстановка в вызове подпроцесса - PullRequest
0 голосов
/ 22 ноября 2011

Я делаю for in range(...):, и мне нужно заменить 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()

Но ничего из этого не работает. Можете ли вы помочь мне сделать это хорошо?

Также - это правда - что когда system("bash command") не wait?

Редактировать

Это сценарий для запуска компьютерного моделирования для различных значений данного параметра. Он копирует каталог baseData для каждого прогона, идет туда, изменяет файл параметров (вставляет значение), затем он должен запустить симуляцию и вернуться назад.

Это не приводит к ошибке - но также не вставляет значение i в md.mdp:

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()

Ответы [ 2 ]

1 голос
/ 22 ноября 2011

Я бы сказал, что проблема в том, что вам не нужно цитировать часть оператора insert. Причина этого заключается в том, что вы используете кавычки в оболочке, чтобы было ясно, что строка между кавычками должна передаваться как один аргумент.

Однако в subprocess.Popen вы используете массив для выполнения тех же функций, поэтому кавычки не нужны. Другими словами, в оболочке кавычки не передаются запускаемому процессу, а при вызове subprocess.Popen они передаются.

0 голосов
/ 22 ноября 2011

работают следующие работы:

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 :

Когда я делаю '(insert \"%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

Хотя оно на самом деле определено, так как команда находится внутри for in in range.....

И когда я делаю '(insert \"%g\")':

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

он просто вставляет% g.

На самом деле я больше не делаю это (вставляя i в определенное место в файле) с помощью emacs:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...