2017-02-17 15 views
0

После написания очень простой питон скрипт для ls содержимого моего каталога проекта в качестве теста:subprocess.Popen команды возвращающее не найден

from subprocess import * 
p = Popen(['ls /Users/Nelson/Projects'], stdout=PIPE, shell=True) 
print(p.communicate()[0].decode()) 

Он вышвырнул ошибку:

/bin/bash: ls: command not found 

I сделал немного тестирования и обнаружил основные команды pwd, echo и cd все слова отлично, но не ls. Я попытался использовать опцию executable='/bin/bash', потому что она по умолчанию равна /bin/sh, но это ничего не делало.

Этот скрипт был протестирован на Ubuntu 14.04 LTS и Ubuntu 16.04 LTS, оба работают нормально.

Я использую Mac OSX 10.12.3 Sierra, если это означает, что что-то в этой ситуации

Любые ответы высоко оценили!

+0

Для записи, '' pwd', echo' и ' cd' - все 'bash' встроенные, а' ls' - отдельная исполняемая программа, а не встроенная. Это может быть причиной расхождения в поведении. – ShadowRanger

ответ

1

Если вы используете вызов list, вам нужно разделить аргументы самостоятельно (и не использовать shell=True). Попробуйте:

Popen(['ls', '/Users/Nelson/Projects'], ... leave off shell=True ...) 

, расщепляющий команду (ls) от единственного аргумента. Если у вас есть несколько аргументов, они также должны быть отделены друг от друга.

Если вы настаиваете на shell=True (ужасной идеей большую часть времени), не используйте list, только необработанный строку:

Popen('ls /Users/Nelson/Projects', ...) 
+0

Большое вам спасибо! Я пробовал с и без ввода команды как 1 строку или 2, и с оболочкой и без нее = True. Думаю, я просто пропустил эту комбинацию. – Nelson

+0

Это неверно. Вы абсолютно можете передать список 'shell = True'. Первый элемент этого списка анализируется как скрипт оболочки; последующие аргументы - '$ 0',' $ 1' и т. д. в этой оболочке. –

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

  • Нет связанных вопросов^_^