2015-07-08 3 views
0

Пытается преобразовать старый скрипт bash в python. Беда в том, что я не очень разбираюсь в bash. Есть ли эквивалентная команда python для команды bash eval? Eval используется в программе Баш, как это:Есть ли способ запустить команду bash eval в python?

eval "(/usr/path/exec/file) &" 

где «файл» представляет собой исполняемый файл.

Если нет эквивалента, кто-то может дать достойное объяснение относительно того, что здесь делает eval? Я сожалею, если это рудиментарный, но это первый сценарий Баш я когда-либо смотрел и я очень смущен

+0

Я не вижу причины использовать eval в этой строке. Или, действительно, использовать круглые скобки. Afaics, цель состоит в том, чтобы запустить исполняемый файл в фоновом режиме. Если на этой строке больше материала, отредактируйте этот вопрос. – rici

ответ

1

Есть несколько вещей, происходящих там. Сначала вы работаете внутри подошвы bash, то есть скобки. Но, вероятно, это не так важно, поскольку в этой подоболочке не изменяются никакие переменные.

Затем вы запускаете программу, а дескрипторы файлов, однако, скопированы, поэтому stdin, stdout и stderr - то же самое.

И вы используете это в фоновом режиме.

Итак, давайте разложим их на Python. Как упоминалось ранее, мы можем игнорировать часть подоболочки.

Что касается запуска программы, то os.system() или subprocess.call является эквивалентом запуска команды без необходимости захвата или изменения ввода или вывода.

Чаще вы сделать необходимость захвата вывода, так эквивалент

x=$(/path/to/exec/file) 

в Python является

x = subprocess.check_output('/path/to/exec/file') 

Смотрите Replacing /bin/sh backquote для получения дополнительной информации.

И, наконец, есть часть о запуске в фоновом режиме. Для этого наиболее эквивалентный матч равен subprocess.popen, как упоминалось в одном из других ответов. Существует также os.fork(), но это не работает на всех ОС, особенно в Windows. Вы также можете рассмотреть использование потоков.

+0

Какая разница в bash между использованием команды eval и просто командой? По существу, в чем разница между этим: Eval «(/ USR/путь/Exec/файл) и» и это: /USR/путь/Exec/файл –

+0

Для конкретного примера дается, набрав только команду будет работать нормально. Eval используется, когда вам нужно построить команду, включающую аргументы в строке. Но если у меня есть 'x = '/ usr/path/exec/file'', вам также не нужно« eval », но вы можете просто запустить' $ x'. eval также может использоваться для отмены цитирования строк. – rocky

1

Используйте subprocess.Popen запустить подпроцесс асинхронно

Пример:

from subprocess import Popen 
p = Popen(['/usr/path/exec/file']) 

делать другие вещи в то время как подпроцесс работает, а затем вызвать

p.terminate() 

или

p.wait() 

Также проверьте документы на https://docs.python.org/2/library/subprocess.html#subprocess.Popen

-1

Сначала я прочитал бы комментарии here для хорошего примера.

Короче говоря, команда eval оценивает ввод и выполнение, но для вашего примера, если вы используете исполняемый файл, это не будет отличаться от просто выполнения команды из CLI. «&» просто сообщает процессу выполнить в фоновом режиме. Посмотрите на this для получения дополнительной информации.

Для выполнения команд CLI в питона вы можете

import subprocess 

Есть три команды, которые вы можете рассмотреть.

subprocess.call() 
output = subprocess.check_output() 
subprocess.Popen() 

В зависимости от того, насколько мелкозернистый вы хотите. Для вас код, сделайте что-то вроде:

import subprocess 

subprocess.call(["/usr/path/exec/file" , "&"]) 

должно вас поймать. check_ouput() вернет любой результат из команды, а Popen() - для более мелкозернистого управления.

+0

Разве это не последняя строка, эквивалентная '/ usr/path/exec/file '&'', тем самым вызывающая программу не в фоновом режиме, а с аргументом '&' в качестве аргумента? – Alfe

Смежные вопросы