Почему подпроцесс 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")
Другие вопросы по тегам