/ / Як назвати Попена іншою оболонкою? - python, windows, shell, subprocess

Як назвати Попена іншою оболонкою? - python, windows, shell, subprocess

Я пишу інструмент, який приймає ряд команд і виконує їх.

Команди повинні бути написані так, якби вони були набрані на терміналі / консолі. Для цього я використовував 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 для відповіді № 1

shell=True майже загально неправильна річ, і це не тут-то інше. У цьому випадку де your_command це рядок, побудований для синтаксичного аналізу за допомогою bash, використання:

subprocess.Popen([r"C:Program Files (x86)Gitbinbash.exe", "-c", your_command])

... і ця команда буде проаналізована лише вказаною оболонкою (тієї, яку надає Git), а не для того, щоб її було проаналізовано оболонкою в COMSPEC щоб створити команду для використання bash.