Я пишу інструмент, який приймає ряд команд і виконує їх.
Команди повинні бути написані так, якби вони були набрані на терміналі / консолі. Для цього я використовував Popen()
з shell=True
так щоб імітувати поведінку когось, що друкує в терміналі / консолі.
Тепер я хотів би дозволити користувачеві вказати командного інтерпретатора, який йому подобається. Точніше, у Windows можна вирішити скористатися своїм "Git bash" замість cmd.exe.
Відповідно до Popen()
документація, вибір інтерпретатора для використання здійснюється через змінну середовища COMSPEC
.
Я спробував встановити COMSPEC
до C:Program Files (x86)Gitbinbash.exe
перед дзвінком, але це не вдається, тому що підпроцесс додає /c
до команди, в той час як base
чекає -c
.
Я думав не користуватися shell=True
але тоді я точно не знаю, якими є відмінності:
- Повинен я
.split()
командний рядок в аргументи? Якщо так, то як? - Є будь-які прапори що
shell=True
означає / встановити?
Мета полягає в тому, щоб не реалізувати "магію" всередині Popen(shell=True)
як і раніше, імітує це найкраще, що можу.
Будь-які думки?
Відповіді:
7 для відповіді № 1shell=True
майже загально неправильна річ, і це не тут-то інше. У цьому випадку де your_command
це рядок, побудований для синтаксичного аналізу за допомогою bash, використання:
subprocess.Popen([r"C:Program Files (x86)Gitbinbash.exe", "-c", your_command])
... і ця команда буде проаналізована лише вказаною оболонкою (тієї, яку надає Git), а не для того, щоб її було проаналізовано оболонкою в COMSPEC
щоб створити команду для використання bash.