Как получить среду от подпроцесса?

Мой фаворит "скрытая" функция C, использование %n в printf для обратной записи к стеку. Обычно printf выталкивает значения параметров от стека на основе строки формата, но %n может записать их обратно.

раздел Выезда 3.4.2 здесь . Может привести к большому количеству противных уязвимостей.

19
задан martineau 23 October 2018 в 11:44
поделиться

6 ответов

Поскольку вы, очевидно, в Windows вам нужен ответ Windows.

Создайте пакетный файл оболочки, например. "run_program.bat" и запустить обе программы:

@echo off
call proc1.bat
proc2

Сценарий запустится и установит свои переменные среды. Оба сценария выполняются в одном интерпретаторе (экземпляр cmd.exe), поэтому переменные prog1.bat sets будут установлены при выполнении prog2.

Не очень красиво, но это будет работать.

(Люди Unix, вы можете сделать то же самое в сценарии bash: "source file.sh".)

2
ответ дан 30 November 2019 в 03:53
поделиться

Как вы говорите, процессы не разделяют среду - так что то, что вы буквально спрашиваете, невозможно не только в Python, но и с любой язык программирования.

То, что вы можете сделать, - это поместить переменные среды в файл или в конвейер, и либо

  • родительский процесс прочитает их, и передаст их proc2 перед proc2 создается, или
  • пусть proc2 прочитает их и установит их локально

Последнее потребует взаимодействия с proc2; первый требует, чтобы переменные стали известны до запуска proc2.

Что вы можете сделать, так это поместить переменные среды в файл или в канал, и либо

  • родительский процесс прочитает их и передаст их proc2 до создания proc2, или
  • пусть proc2 прочитает их и установит их локально

Последнее потребует сотрудничества со стороны proc2; первый требует, чтобы переменные стали известны до запуска proc2.

Что вы можете сделать, так это поместить переменные среды в файл или в канал, и либо

  • родительский процесс прочитает их и передаст их proc2 до создания proc2, или
  • пусть proc2 прочитает их и установит их локально

Последнее потребует взаимодействия со стороны proc2; первый требует, чтобы переменные стали известны до запуска proc2.

5
ответ дан 30 November 2019 в 03:53
поделиться

На ум приходят две вещи: (1) заставить процессы использовать одну и ту же среду, каким-то образом объединяя их в один и тот же процесс, или (2) сделать так, чтобы первый процесс производил выходные данные, которые содержат соответствующие переменные среды, таким образом Python может их прочитать и построить среду для второго процесса. Я думаю (хотя я не уверен на 100%), что нет никакого способа получить среду из подпроцесса, как вы надеетесь.

0
ответ дан 30 November 2019 в 03:53
поделиться

Среда унаследована от родительского процесса. Установите необходимую среду в основном сценарии, а не в подпроцессе (дочернем).

-1
ответ дан 30 November 2019 в 03:53
поделиться

В стандартном модуле Python multiprocessing есть система очередей, которая позволяет передавать обрабатываемые объекты для передачи через процессы. Также процессы могут обмениваться сообщениями (маринованный объект) с помощью os.pipe. Помните, что ресурсы (например, соединение с базой данных) и дескриптор (например, дескрипторы файлов) не могут быть обработаны.

Эта ссылка может показаться вам интересной: Связь между процессами с многопроцессорностью

Также стоит упомянуть PyMOTw о многопроцессорности: Основы многопроцессорной обработки

извините за мою орфографию

0
ответ дан 30 November 2019 в 03:53
поделиться

Вот пример того, как можно извлечь переменные среды из пакетного файла или файла 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)
27
ответ дан 30 November 2019 в 03:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: