2015-03-02 2 views
1

У меня есть сценарий Python, который принимает аргументы из командной строки, используя «Argparser». Здесь я указываю местоположение определенного файла. Затем я вызываю другой инструмент командной строки, установленный в моем поле, и передаю это местоположение файла этому инструменту. Для работы инструмента требуется создать выходной каталог.Модуль подпроцесса Python: «Не удалось создать каталог»

Теперь моя проблема заключается в том, что на своем собственном инструменте нет проблем с созданием каталога вывода в указанном вами местоположении. Например: #tool -o ~/output filelocation' заставляет инструмент читать файл из файловой области и создавать каталог с именем 'output' в моей домашней папке для хранения результатов. Но, когда я взываю то же самое с помощью модуля подпроцесс в Python, он дает мне ошибку:

subprocess.call(['tool', '-o ~/output', args.filelocation]) 

Это приводит к:

Could not make directory ~/output

Я бегу все это с привилегиями суперпользователя. Я не знаю, почему этот «инструмент» не может создать каталог при вызове через модуль подпроцесса. Любая помощь будет оценена по достоинству.

EDIT: Это дает мне ту же ошибку, даже если я использую абсолютный путь. Например, я использую:

subprocess.call(['tool', '-o /root/output', args.filelocation]) 

Результат:

Could not make directory /root/bulk

+0

ли работа, если вы используете 'оболочки = True '? – SethMMorton

+0

Также вы должны построить аргумент следующим образом: '['tool', '-o', '~/output', args.filelocation]'. Все, разделенное пробелом, должно быть новым элементом в списке команд. Возможно, это и есть проблема. – SethMMorton

+0

Наличие привилегий root (обязательно) совпадает с правами root. –

ответ

3

Вы можете использовать os.path.expanduser(path), если хотите использовать ~.

On Unix and Windows, return the argument with an initial component of ~ or ~user replaced by that user‘s home directory.

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

Обычной практикой является использование str.split() и отправить его в списке аргументов:

subprocess.call(
    "some command with arguments".split() 
) 

Применение тильды к коду:

subprocess.call(
    ['tool', '-o', os.path.expanduser('~/output'), args.filelocation] 
) 
+0

Да, это сработало! Однако я не уверен, почему он не работал, когда я использовал абсолютный путь, например '/ root/output'. Пожалуйста, дайте мне знать, если вы знаете, почему. – learnerX

+0

@intellikid Что означает 'os.path.expanduser ('~/output')' дать вам? –

+0

читайте здесь: https://docs.python.org/2/library/subprocess.html#frequently-used-arguments –

1

~/ расширяется вашей оболочкой, которая не используется на Ваш звонок. Попробуйте использовать абсолютный путь, например /home/myuser/output. В качестве альтернативы использование shell=True может помочь, но это действительно опасно, поскольку все переменные среды и т. Д. Привыкают.

+0

Вот что я тоже подумал. Поэтому я попытался использовать абсолютный путь; это та же ошибка: «Не удалось создать каталог/root/output» – learnerX

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