2013-12-05 5 views
2

Folks, Я пытаюсь вызвать исполняемый файл из этого кода, и он не работает должным образом по какой-то причине (Python 2.6)питона не subprocess.check_call разбор правильно

subprocess.check_call(
['fpm', '-s', 'dir', '-t', 'rpm', '-n', 'name', '-v', 'rpmversion', 
    '--prefix=/opt/', '--rpm-auto-add-directories', 'target'], shell=True) 

выход:

{:message=>"Missing required -s flag. What package source did you want?", :level=>:warn, :timestamp=>"2013-12-05T17:37:29. %6N+0000"} 
{:message=>"Missing required -t flag. What package output did you want?", :level=>:warn, :timestamp=>"2013-12-05T17:37:29. %6N+0000"} 
{:message=>"No parameters given. You need to pass additional command arguments so that I know what you want to build packages from. For example, for '-s dir' you would pass a list of files and directories. For '-s gem' you would pass a one or more gems to package from. As a full example, this will make an rpm of the 'json' rubygem: `fpm -s gem -t rpm json`", :level=>:warn, :timestamp=>"2013-12-05T17:37:29. %6N+0000"} 

subprocess.CalledProcessError: Command '['fpm', '-s', 'dir', '-t', 'rpm', '-n', 'name', '-v', 'rpmversion', '--prefix=/opt/', '--rpm-auto-add-directories', 'target']' returned non-zero exit status 1 
Build step 'Execute shell' marked build as failure 

Выполнение этой же команды из cli прекрасно работает. Какие-либо предложения?

ответ

4

Лучше не использовать shell=True, если это не требуется (поскольку это может быть угрозой безопасности при использовании с предоставленными пользователем аргументами - см. Warning in the docs). В этом случае, вы можете использовать

subprocess.check_call(
['fpm', '-s', 'dir', '-t', 'rpm', '-n', 'name', '-v', 'rpmversion', 
    '--prefix=/opt/', '--rpm-auto-add-directories', 'target']) 

Когда shell=True, вы должны передать строку в качестве первого аргумента:

subprocess.check_call(
    'fpm -s dir -t rpm -n name -v rpmversion --prefix=/opt/ --rpm-auto-add-directories target', shell=True) 
Смежные вопросы