subprocess.Popen: mkvirtualenv не найден

Я использую virtualenvwrapper в своем развертывании. Чтобы настроить новые среды, я запускаю скрипт python, который содержит все необходимые шаги.

В установочном файле:

cmd = 'mkvirtualenv %s --no-site-packages'%('testname') head = subprocess.Popen(cmd,shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) for line in head.stdout.read().splitlines(): print line 

Выход:

 /bin/sh: mkvirtualenv: not found 

Как я могу правильно использовать virtualenvwrapper в моем сценарии python?

РЕДАКТИРОВАТЬ:

Для меня работает следующий код:

 cmd = 'source /usr/local/bin/virtualenvwrapper.sh && mkvirtualenv %s --no-site-packages'%('testname') head = subprocess.Popen(cmd, executable='bash', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) for line in head.stdout.read().splitlines(): print line 

Спасибо за все ответы.

mkvirtualenv может быть функцией оболочки, которая добавляется в вашу среду путем поиска скрипта virtualenvwrapper.sh из файла запуска вашей оболочки . Команда по умолчанию, вызываемая в shell=True (например, /bin/sh -c ... ), может ее не читать.

Вы можете явно указать файл:

 import pipes from subprocess import check_call check_call("""source /path/to/virtualenvwrapper.sh && mkvirtualenv --no-site-packages """ + pipes.quote(envname), executable='bash', shell=True) 

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

Я узнал, что mkvirtualenv – это функция оболочки. В этом случае возникает вопрос, how to run shell function in python . Мой ответ ниже может быть применен к автономным двоичным файлам. На ваш вопрос, пожалуйста, посмотрите на ответ: https://stackoverflow.com/a/5826523/1906700 Вы можете косвенно вызвать функцию mkvirtualenv () из скрипта, который ее определяет.

Правильно установите переменную PATH

Проблема, похоже, вызвана $PATH . Вам нужно правильно установить эту переменную, чтобы можно было найти исполняемый файл mkvirtualenv . Например, если у вас есть исполняемый файл mkvirtualenv в / home / thore / scripts, вам нужно установить $ PATH в .bashrc или .zshrc (в зависимости от вашей оболочки) следующим образом:

  export PATH=$PATH:/home/thore/scripts 

Таким образом, скрипт mkvirtualenv будет найден правильно и запущен.

Другое решение

Другим решением проблемы будет использование точного пути для рассматриваемого сценария. В этом случае вы можете /home/thore/scripts/mkvirtualenv в качестве параметра для подпроцесса.