복붙노트

[PYTHON] 하위 프로세스에서 환경을 얻는 방법?

PYTHON

하위 프로세스에서 환경을 얻는 방법?

파이썬 프로그램을 통해 프로세스를 호출하고 싶지만이 프로세스는 다른 프로세스에서 설정 한 특정 환경 변수가 필요합니다. 첫 번째 프로세스 환경 변수를 두 번째 환경 변수로 전달할 수있는 방법은 무엇입니까?

이것은 프로그램의 모습입니다.

import subprocess

subprocess.call(['proc1']) # this set env. variables for proc2
subprocess.call(['proc2']) # this must have env. variables set by proc1 to work

to 프로세스는 동일한 환경을 공유하지 않습니다. 이 프로그램들은 광산이 아닙니다. (처음은 크고 못생긴 .bat 파일이고, 두 번째는 독점 소프트입니다.) 그래서 나는 그것을 수정할 수 없습니다. (좋아요, .bat에서 필요한 모든 것을 추출 할 수 있습니다. 그러나 매우 combersome입니다. ).

N.B. : Windows를 사용하고 있지만 크로스 플랫폼 솔루션을 선호합니다 (그러나 Unix와 같은 문제는 발생하지 않을 것입니다 ...)

해결법

  1. ==============================

    1.당신이 분명히 Windows에 있기 때문에 Windows 대답이 필요합니다.

    당신이 분명히 Windows에 있기 때문에 Windows 대답이 필요합니다.

    래퍼 배치 파일을 만듭니다 (예 : "run_program.bat"을 실행하고 두 프로그램을 모두 실행하십시오.

    @echo off
    call proc1.bat
    proc2
    

    스크립트는 환경 변수를 실행하고 설정합니다. 두 스크립트는 같은 인터프리터 (cmd.exe 인스턴스)에서 실행되므로 prog2가 실행될 때 변수 prog1.bat 세트가 설정됩니다.

    굉장히 예쁜 것은 아니지만 작동 할 것입니다.

    (유닉스 사람들은 bash 스크립트에서 "source file.sh"와 같은 것을 할 수있다.)

  2. ==============================

    2.다음은 래퍼 스크립트를 작성하지 않고 배치 또는 cmd 파일에서 환경 변수를 추출하는 방법의 예입니다. 즐겨.

    다음은 래퍼 스크립트를 작성하지 않고 배치 또는 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)
    
  3. ==============================

    3.말했듯이 프로세스는 환경을 공유하지 않으므로 문자 그대로 묻지 않는 것은 파이썬뿐만 아니라 모든 프로그래밍 언어에서도 가능합니다.

    말했듯이 프로세스는 환경을 공유하지 않으므로 문자 그대로 묻지 않는 것은 파이썬뿐만 아니라 모든 프로그래밍 언어에서도 가능합니다.

    당신이 할 수있는 일은 파일이나 파이프에 환경 변수를 넣는 것입니다.

    후자는 proc2와 협력해야 할 것이다. 전자는 proc2가 시작되기 전에 변수가 알려 지도록 요구합니다.

  4. ==============================

    4.두 가지 사항을 염두에 두십시오 : (1) 프로세스를 어떻게해서든지 동일한 프로세스에 결합하여 동일한 환경을 공유하게하거나 (2) 첫 번째 프로세스가 관련 환경 변수를 포함하는 출력을 생성하게하여 파이썬이이를 읽을 수있게하고 두 번째 프로세스의 환경을 구성하십시오. 나는 (비록 100 % 확신하지는 않지만) 당신이하고자하는 것처럼 하위 프로세스로부터 환경을 얻는 방법이 없다고 생각한다.

    두 가지 사항을 염두에 두십시오 : (1) 프로세스를 어떻게해서든지 동일한 프로세스에 결합하여 동일한 환경을 공유하게하거나 (2) 첫 번째 프로세스가 관련 환경 변수를 포함하는 출력을 생성하게하여 파이썬이이를 읽을 수있게하고 두 번째 프로세스의 환경을 구성하십시오. 나는 (비록 100 % 확신하지는 않지만) 당신이하고자하는 것처럼 하위 프로세스로부터 환경을 얻는 방법이 없다고 생각한다.

  5. ==============================

    5.Python 표준 모듈 다중 처리에는 대기열 시스템이있어 피클 할 수있는 객체를 프로세스를 통해 전달할 수 있습니다. 또한 프로세스는 os.pipe를 사용하여 메시지 (피클 링 된 객체)를 교환 할 수 있습니다. 리소스 (예 : 데이터베이스 연결) 및 핸들 (예 : 파일 핸들)은 절대로 저장할 수 없습니다.

    Python 표준 모듈 다중 처리에는 대기열 시스템이있어 피클 할 수있는 객체를 프로세스를 통해 전달할 수 있습니다. 또한 프로세스는 os.pipe를 사용하여 메시지 (피클 링 된 객체)를 교환 할 수 있습니다. 리소스 (예 : 데이터베이스 연결) 및 핸들 (예 : 파일 핸들)은 절대로 저장할 수 없습니다.

    이 링크는 흥미로운 것 같습니다. 멀티 프로세싱을 통한 프로세스 간 통신

    또한 언급 할 가치가있는 멀티 프로세싱에 대한 PyMOTw : 다중 처리 기본 사항

    내 철자를 유감스럽게 생각한다.

  6. ==============================

    6.환경은 상위 프로세스로부터 상속됩니다. 하위 프로세스 (하위)가 아닌 기본 스크립트에서 필요한 환경을 설정하십시오.

    환경은 상위 프로세스로부터 상속됩니다. 하위 프로세스 (하위)가 아닌 기본 스크립트에서 필요한 환경을 설정하십시오.

  7. from https://stackoverflow.com/questions/1214496/how-to-get-environment-from-a-subprocess by cc-by-sa and MIT license