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