Мой фаворит "скрытая" функция C, использование %n в printf для обратной записи к стеку. Обычно printf выталкивает значения параметров от стека на основе строки формата, но %n может записать их обратно.
раздел Выезда 3.4.2 здесь . Может привести к большому количеству противных уязвимостей.
Поскольку вы, очевидно, в Windows вам нужен ответ Windows.
Создайте пакетный файл оболочки, например. "run_program.bat" и запустить обе программы:
@echo off
call proc1.bat
proc2
Сценарий запустится и установит свои переменные среды. Оба сценария выполняются в одном интерпретаторе (экземпляр cmd.exe), поэтому переменные prog1.bat sets будут установлены при выполнении prog2.
Не очень красиво, но это будет работать.
(Люди Unix, вы можете сделать то же самое в сценарии bash: "source file.sh".)
Как вы говорите, процессы не разделяют среду - так что то, что вы буквально спрашиваете, невозможно не только в Python, но и с любой язык программирования.
То, что вы можете сделать, - это поместить переменные среды в файл или в конвейер, и либо
Последнее потребует взаимодействия с proc2; первый требует, чтобы переменные стали известны до запуска proc2.
Что вы можете сделать, так это поместить переменные среды в файл или в канал, и либо
Последнее потребует сотрудничества со стороны proc2; первый требует, чтобы переменные стали известны до запуска proc2.
Что вы можете сделать, так это поместить переменные среды в файл или в канал, и либо
Последнее потребует взаимодействия со стороны proc2; первый требует, чтобы переменные стали известны до запуска proc2.
На ум приходят две вещи: (1) заставить процессы использовать одну и ту же среду, каким-то образом объединяя их в один и тот же процесс, или (2) сделать так, чтобы первый процесс производил выходные данные, которые содержат соответствующие переменные среды, таким образом Python может их прочитать и построить среду для второго процесса. Я думаю (хотя я не уверен на 100%), что нет никакого способа получить среду из подпроцесса, как вы надеетесь.
Среда унаследована от родительского процесса. Установите необходимую среду в основном сценарии, а не в подпроцессе (дочернем).
В стандартном модуле Python multiprocessing есть система очередей, которая позволяет передавать обрабатываемые объекты для передачи через процессы. Также процессы могут обмениваться сообщениями (маринованный объект) с помощью os.pipe. Помните, что ресурсы (например, соединение с базой данных) и дескриптор (например, дескрипторы файлов) не могут быть обработаны.
Эта ссылка может показаться вам интересной: Связь между процессами с многопроцессорностью
Также стоит упомянуть PyMOTw о многопроцессорности: Основы многопроцессорной обработки
извините за мою орфографию
Вот пример того, как можно извлечь переменные среды из пакетного файла или файла cmd без создания сценария оболочки. Наслаждаться.
from __future__ import print_function
import sys
import subprocess
import itertools
def validate_pair(ob):
try:
if not (len(ob) == 2):
print("Unexpected result:", ob, file=sys.stderr)
raise ValueError
except:
return False
return True
def consume(iter):
try:
while True: next(iter)
except StopIteration:
pass
def get_environment_from_batch_command(env_cmd, initial=None):
"""
Take a command (either a single command or list of arguments)
and return the environment created after running that command.
Note that if the command must be a batch file or .cmd file, or the
changes to the environment will not be captured.
If initial is supplied, it is used as the initial environment passed
to the child process.
"""
if not isinstance(env_cmd, (list, tuple)):
env_cmd = [env_cmd]
# construct the command that will alter the environment
env_cmd = subprocess.list2cmdline(env_cmd)
# create a tag so we can tell in the output when the proc is done
tag = 'Done running command'
# construct a cmd.exe command to do accomplish this
cmd = 'cmd.exe /s /c "{env_cmd} && echo "{tag}" && set"'.format(**vars())
# launch the process
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, env=initial)
# parse the output sent to stdout
lines = proc.stdout
# consume whatever output occurs until the tag is reached
consume(itertools.takewhile(lambda l: tag not in l, lines))
# define a way to handle each KEY=VALUE line
handle_line = lambda l: l.rstrip().split('=',1)
# parse key/values into pairs
pairs = map(handle_line, lines)
# make sure the pairs are valid
valid_pairs = filter(validate_pair, pairs)
# construct a dictionary of the pairs
result = dict(valid_pairs)
# let the process finish
proc.communicate()
return result
Итак, чтобы ответить на ваш вопрос, вы должны создать файл .py, который выполняет следующие действия:
env = get_environment_from_batch_command('proc1')
subprocess.Popen('proc2', env=env)