복붙노트

[PYTHON] Linux의 Python 환경 변수

PYTHON

Linux의 Python 환경 변수

환경 변수에 대한 파이썬의 액세스는 운영 환경의 프로세스 환경에 대한 관점을 정확하게 반영하지 않습니다.

os.getenv 및 os.environ은 특정 경우에 예상대로 작동하지 않습니다.

실행중인 프로세스의 환경을 제대로 가져올 수있는 방법이 있습니까?

내가 의미하는 바를 증명하기 위해 두 개의 대략 동일한 프로그램 (C의 첫 번째 프로그램, 파이썬의 다른 프로그램)을 가져옵니다.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char *argv[]){
    char *env;
    for(;;){
        env = getenv("SOME_VARIABLE");
        if(env)
            puts(env);
        sleep(5);
    }
}
import os
import time
while True:
    env = os.getenv("SOME_VARIABLE")
    if env is not None:
        print env
    time.sleep(5)

이제 우리가 C 프로그램을 실행하고 gdb를 사용하여 실행중인 프로세스에 연결하고 다음과 같이 무언가를함으로써 강제로 환경을 변경한다면 :

(gdb) print setenv("SOME_VARIABLE", "my value", 1)
[Switching to Thread -1208600896 (LWP 16163)]
$1 = 0
(gdb) print (char *)getenv("SOME_VARIABLE")
$2 = 0x8293126 "my value"

위에서 언급 한 C 프로그램은 매 5 초마다 한 번씩 "내 가치"를 분출하기 시작합니다. 그러나 앞서 언급 한 파이썬 프로그램은 그렇지 않습니다.

이 경우에 C 프로그램처럼 파이썬 프로그램을 작동시키는 방법이 있습니까?

(예, 이것은 실행중인 프로세스에서 수행 할 수있는 매우 모호하고 잠재적으로 위험한 동작 임)

또한, 현재 파이썬 2.4를 사용하고 있습니다. 파이썬의 최신 버전에서 수정되었을 수 있습니다.

해결법

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

    1.그것은 아주 좋은 질문입니다.

    그것은 아주 좋은 질문입니다.

    os 모듈은 os.environ을 인터프리터 시작시 설정되는 posix.environ 값으로 초기화합니다. 즉, 표준 라이브러리는 getenv 함수에 대한 액세스를 제공하지 않는 것처럼 보입니다.

    유닉스에서 ctype을 사용하는 것이 안전 할 수있는 경우입니다. 이후 당신은 매우 표준적인 libc 함수를 호출 할 것이기 때문에.

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

    2.ctypes를 사용하면 다음과 같이 간단하게 할 수 있습니다.

    ctypes를 사용하면 다음과 같이 간단하게 할 수 있습니다.

    >>> from ctypes import CDLL, c_char_p
    >>> getenv = CDLL("libc.so.6").getenv
    >>> getenv.restype = c_char_p
    >>> getenv("HOME")
    '/home/glyph'
    
  3. ==============================

    3.또 다른 가능성은 pdb 또는 다른 파이썬 디버거를 대신 사용하고, C 레벨이 아닌 파이썬 레벨에서 os.environ을 변경하는 것입니다. 다음은 실행중인 파이썬 프로세스를 인터럽트하고 신호 수신시 파이썬 콘솔에 대한 액세스를 제공하기 위해 게시 한 작은 레시피입니다. 또는, 인터럽트하려는 코드의 pdb.set_trace ()를 지정하십시오. 두 경우 모두 "import os; os.environ [ 'SOME_VARIABLE'] = 'my_value'"문을 실행하면 파이썬에 관한 한 업데이트해야합니다.

    또 다른 가능성은 pdb 또는 다른 파이썬 디버거를 대신 사용하고, C 레벨이 아닌 파이썬 레벨에서 os.environ을 변경하는 것입니다. 다음은 실행중인 파이썬 프로세스를 인터럽트하고 신호 수신시 파이썬 콘솔에 대한 액세스를 제공하기 위해 게시 한 작은 레시피입니다. 또는, 인터럽트하려는 코드의 pdb.set_trace ()를 지정하십시오. 두 경우 모두 "import os; os.environ [ 'SOME_VARIABLE'] = 'my_value'"문을 실행하면 파이썬에 관한 한 업데이트해야합니다.

    나는 이것이 setenv로 C 환경을 업데이트 할 지 확신하지 못한다. 따라서 getenv를 직접 사용하는 C 모듈이 있다면 이것을 동기화하기 위해 더 많은 작업을해야 할 수도있다.

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

    4.필자는 많은 프로그램이 환경이 외부에서 수정 될 것으로 예상했기 때문에 시작시 통과 된 환경의 사본을로드하는 것은 동등합니다. 당신은 단순히 구현 선택을 우연히 발견했습니다.

    필자는 많은 프로그램이 환경이 외부에서 수정 될 것으로 예상했기 때문에 시작시 통과 된 환경의 사본을로드하는 것은 동등합니다. 당신은 단순히 구현 선택을 우연히 발견했습니다.

    프로그램 내에서 모든 set-at-startup 값과 putenv / setenv를 볼 수 있다면 걱정할 것이 없다고 생각합니다. 업데이트 된 정보를 실행 파일에 전달하는 방법은 훨씬 깨끗합니다.

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

    5.파이썬 소스 코드 (2.4.5)를 보자.

    파이썬 소스 코드 (2.4.5)를 보자.

    그렇습니다. 시작시 결정됩니다. os.environ은 여기서 도움이되지 않을 것입니다.

    정말로 이것을하고 싶다면 가장 마음에 드는 접근법은 항상 시스템 호출을 호출하는 getenv를 사용하여 사용자 정의 C 기반 Python 모듈을 만드는 것입니다.

  6. from https://stackoverflow.com/questions/235435/environment-variables-in-python-on-linux by cc-by-sa and MIT license