Интересный вопрос.
Один из подходов, который работает, - это запустить командную оболочку и затем передать ей команды через stdin
(пример использует Python 3, для Python 2 вы можете пропустить вызов decode()
),Обратите внимание, что вызов командной оболочки настроен на подавление всего, кроме явного вывода, записанного в stdout.
>>> import subprocess
>>> cmdline = ["cmd", "/q", "/k", "echo off"]
>>> cmd = subprocess.Popen(cmdline, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
>>> batch = b"""\
... set TEST_VAR=Hello World
... set TEST_VAR
... echo %TEST_VAR%
... exit
... """
>>> cmd.stdin.write(batch)
59
>>> cmd.stdin.flush() # Must include this to ensure data is passed to child process
>>> result = cmd.stdout.read()
>>> print(result.decode())
TEST_VAR=Hello World
Hello World
Сравните это с результатом отдельных вызовов subprocess.call
:
>>> subprocess.call(["set", "TEST_VAR=Hello World"], shell=True)
0
>>> subprocess.call(["set", "TEST_VAR"], shell=True)
Environment variable TEST_VAR not defined
1
>>> subprocess.call(["echo", "%TEST_VAR%"], shell=True)
%TEST_VAR%
0
Последние два вызова не могут видеть среду, настроенную первым, поскольку все 3 являются различными дочерними процессами.