2016-07-28 2 views
0

команды:

make foo -f $* 

Имеет различную функциональность при вызове из командной строки в сравнении, когда она вызывается из питона сценария следующим образом:

import os 
os.system(make foo -f $*) 

Как указано здесь: http://tldp.org/LDP/abs/html/internalvariables.html#APPREF $ * в bat-файле в основном все позиционные параметры, рассматриваемые как одно слово.

Python, похоже, разбирает его как просто «$ *». Есть ли способ обойти это и воспроизвести ту же функциональность?

Я понимаю, что могу написать сценарий .bat и назвать это с помощью python, но я надеялся на что-то более красноречивое.

+0

Забудьте о 'os.system'. Всегда используйте функции из 'subprocess' и * avoid *, передавая' shell = True' как можно больше. – Bakuriu

ответ

1

Как вы указываете, $ * не имеет особого значения в python. Понимание полностью выполняется любой оболочкой, которую вы используете. Если вы хотите передать все позиционные параметры, передаваемые в сценарий в какой-то команде, то вы можете попробовать следующее

import os, sys 
os.system("make foo -f {}".format(" ".join(sys.argv[1:]))) 

Пожалуйста, обратите внимание, однако, что os.system осуждается. Вероятно, вы должны использовать

import subprocess, sys 
subprocess.check_call("make foo -f {}".format(" ".join(sys.argv[1:])), shell=True) 

вместо этого.

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

Как указывается в комментариях, следует избегать использования shell=True всякий раз, когда команда строится из «ненадежного» ввода, например, как в командной строке программы. Поэтому гораздо лучшей альтернативой является использование

import subprocess, sys 
subprocess.check_call(['make', 'foo', '-f'] + sys.argv[1:]) 
+2

Обратите внимание, что для этого не нужно использовать 'shell = True'. Проще просто использовать 'check_call (['make', 'foo', '-f'] + sys.argv [1:])' вы даже избавляетесь от вызова 'join'. – Bakuriu

+0

@Bakuriu Хорошая точка :) –

+0

@Bakuriu избил меня до этого - нет причин использовать оболочку здесь, если смотреть на пример - лучше всего избегать этого, где это возможно, чтобы избежать потенциально «интересных» команд, проскальзывающих через –