2015-11-11 3 views
1

В настоящее время я пишу скрипт для клиента.Подпроцесс Python Call с переменными

Этот скрипт читается из файла конфигурации. Некоторые из этих сведений затем хранятся в переменных.

Затем я хочу использовать subprocess.call выполнить команда монтирования Таким образом, я использую эти переменные для создания команды монтирования

call("mount -t cifs //%s/%s %s -o username=%s" % (shareServer, cifsShare, mountPoint, shareUser)) 

Однако это не работает

Traceback (most recent call last): 
    File "mount_execute.py", line 50, in <module> 
    main() 
    File "mount_execute.py", line 47, in main 
    call("mount -t cifs //%s/%s %s -o username=%s" % (shareServer, cifsShare, mountPoint, shareUser)) 
    File "/usr/lib64/python2.6/subprocess.py", line 470, in call 
return Popen(*popenargs, **kwargs).wait() 
    File "/usr/lib64/python2.6/subprocess.py", line 623, in __init__ 
errread, errwrite) 
    File "/usr/lib64/python2.6/subprocess.py", line 1141, in _execute_child 
    raise child_exception 
OSError: [Errno 2] No such file or directory 

ПОСТРОЕНИЯ команда сначала с

mountCommand = 'mount -t cifs //%s/%s %s -o username=%s' % (shareServer, cifsShare, mountPoint, shareUser) 
call(mountCommand) 

также приводит к тому же ошибка.

+0

'вызов ([ 'монтирования', '-t', 'CIFS', '//% s /% s' % (shareServer, cifsShare), MOUNTPOINT, '-o',«имя пользователя =% s '% shareUser]) ' –

+0

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

ответ

2

Ваш текущий вызов написан для использования с shell=True, но на самом деле его не использует. Если вы действительно хотите использовать строку, которую нужно разобрать с помощью оболочки, используйте call(yourCommandString, shell=True).


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

call(['mount', 
     '-t', 'cifs', 
     '//%s/%s' % (shareServer, cifsShare), 
     mountPoint, 
     '-o', 'username=%s' % shareUser]) 
Смежные вопросы