Почему подпроцесс python перестает выполняться при запуске определенной команды?
Я хочу автоматизировать определенные задачи во время разработки. Это часть одной из этих задач. Я пытаюсь установить django автоматически с pipenv.
import os
import subprocess
def run(project):
os.mkdir(project)
os.chdir(project)
subprocess.run("pipenv install django".split())
os.mkdir("io")
os.chdir("io")
subprocess.run("pipenv shell".split())
subprocess.run("django-admin startproject _django".split())
print(f"Created new django project at {project}/io/_django")
if __name__ == '__main__':
run("hello-world")
Когда я запускаю этот код, он выполняется до строки:
subprocess.run("pipenv shell".split())
но не запускает следующие строки. Это почему? И как это решить?
2 ответа
Это потому что pipenv shell
порождает интерактивную оболочку и ожидает ввода в stdin.
Вы бы лучше использовать pipenv run
запускать команды в вашей виртуальной среде: pipenv run django-admin ...
PS: вы можете удалить .split()
, subprocess.run
может работать с командой в виде строки. Используйте явный массив аргументов, если вам нужно включить пробел в качестве символа внутри аргумента или при работе с ненадежными (предоставленными пользователем) аргументами.
Окончательный код куратора: (Авторы @Andrew Morozko)
import os
import subprocess
def run(project):
os.mkdir(project)
os.chdir(project)
subprocess.run("pipenv install django")
os.mkdir("io")
os.chdir("io")
subprocess.run("pipenv run django-admin startproject _django")
print(f"Created new django project at {project}/io/_django")
if __name__ == '__main__':
run("hello-world")