/ / Как да се обадя с попън с различна обвивка? - питън, прозорци, черупки, подпроцес

Как да се обадите на Попен с различна обвивка? - питън, прозорци, черупки, подпроцес

Пиша инструмент, който отнема серия от команди и ги изпълнява.

Командите трябва да бъдат написани така, сякаш са написани в терминал / конзола. За да направя това, използвах 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.