Как вызвать несколько функций Bash, используя | в питоне - PullRequest
4 голосов
/ 08 марта 2012

Я использую научное программное обеспечение (называемое vasp), которое работает только в bash, и использую Python для создания сценария, который будет выполнять несколько прогонов для меня.Когда я использую subprocess.check_call для нормального вызова функции, она работает нормально, но когда я добавляю '|tee tee_output 'это не работает.

subprocess.check_call('vasp') #this works
subprocess.check_call('vasp | tee tee_output') #this doesn't

Я новичок в питоне и программировании в целом.

Ответы [ 4 ]

4 голосов
/ 08 марта 2012

Попробуй это.Он выполняет команду (передаваемую в виде строки) через оболочку вместо непосредственного выполнения команды.(Это эквивалентно вызову самой оболочки с флагом -c, т.е. Popen(['/bin/sh', '-c', args[0], args[1], ...])):

subprocess.check_call('vasp | tee tee_output', shell=True)

Но обратите внимание на предупреждение в документах об этом методе.

2 голосов
/ 08 марта 2012

Не используйте shell = True, у него много дыр в безопасности.Вместо этого сделайте что-то вроде этого

cmd1 = ['vasp']
cmd2 = ['tee', 'tee_output']

runcmd = subprocess.Popen(cmd1, stdout=subprocess.PIPE)
runcmd2 = subprocess.Popen(cmd2, stdin=runcmd.stdout, stdout=subprocess.PIPE)

runcmd2.communicate()

Я знаю, что это дольше, но гораздо безопаснее.

2 голосов
/ 08 марта 2012

Вы можете сделать это:

vasp = subprocess.Popen('vasp', stdout=subprocess.PIPE)
subprocess.check_call(('tee', 'tee_output'), stdin=vasp.stdout)

Обычно это безопаснее, чем использовать shell=True, особенно если вы не можете доверять вводу.

Обратите внимание, что check_call провериткод возврата tee, а не vasp, чтобы увидеть, должен ли он поднять CalledProcessError.(Метод shell=True будет делать то же самое, поскольку он соответствует поведению конвейера оболочки.) Если вы хотите, вы можете проверить код возврата vasp самостоятельно, вызвав vasp.poll().(Другой метод не позволит вам сделать это.)

0 голосов
/ 08 марта 2012

Более подробную информацию вы можете найти в документации: http://docs.python.org/library/pipes.html

Просто добавьте больше строк к t объекту

...