Mac OS X: Python 스크립트 내에서 $PATH 변경

Mac OS X: Python 스크립트 내에서 $PATH 변경

나는 많은 Python 스크립트를 가지고 있습니다. 그 중 하나는 $PATH에 경로를 추가해야 하는 소프트웨어(전복)를 설치합니다. 설치 후 다음 스크립트에서 소프트웨어를 사용하고 싶습니다. 첫 번째 스크립트와 두 번째 스크립트 사이에 bash를 실행하면 export PATH=/opt/subversion/bin:$PATH모두 괜찮습니다. 그러나 os.system( 'export PATH=/opt/subversion/bin:$PATH' )첫 번째 스크립트(Subversion을 설치하는)의 마지막 명령으로 추가하면 $PATH종료 후에도 변경되지 않은 상태로 유지됩니다.

Python 스크립트 내에서 $PATH를 변경하여 스크립트가 완료된 후에도 변경된 상태로 유지되도록 하는 방법이 있습니까? (물론 단일 bash 세션 내에서 에 대해 알고 있습니다 /etc/profile.)

답변1

os.system()하위 쉘을 생성합니다. 따라서 기존 쉘에 대한 지식이 없습니다.

물론 명령을 실행할 때 (내보내지 않고) 경로를 설정할 수 있습니다. 즉:

PATH="$PATH:/opt/subversion/bin" /command/to/run

아, 그리고 os.system()은 가치가 하락하고 있습니다. 다음으로 전환해야 합니다.subprocess.Popen().

답변2

일반적으로 그것은 불가능합니다. 한 프로세스는 다른 프로세스의 환경을 변경할 수 없습니다.

부모는 자신이 생성하는 자식 프로세스의 환경을 미리 설정할 수 있지만 해당 응용 프로그램이 이를 허용하도록 특별히 설계되지 않는 한 한 프로세스가 다른 프로세스의 환경에 영향을 미칠 수 있는 방법은 실제로 없습니다.

답변3

다른 사람들이 지적했듯이 상위 프로세스의 환경을 수정할 방법은 실제로 없습니다. 상위 프로세스의 메모리 내부를 조작해야 하며, 내가 아는 한 이를 수행하는 잘 정의된 방법은 없습니다(즉, 쉘이 충돌할 가능성이 높습니다).

나중에 실행하는 스크립트/프로그램이 Python인 경우 해당 프로그램에서 가장 먼저 수행하는 작업으로 해당 환경에 Subversion 경로를 추가할 수 있습니다.

import os
os.environ['PATH'] = "/opt/subversion/bin:" + os.environ['PATH']

또는 항상 동일한 인수를 사용하여 동일한 순서로 동일한 스크립트를 실행하는 경우 자체적으로 환경을 설정하고 해당 프로그램/스크립트를 실행하는 쉘 스크립트로 래핑하십시오.

또 다른 해결 방법도 있습니다. Subversion을 설치하는 스크립트에서 마지막으로 수행하는 작업으로 해당 프로세스를 원하는 환경이 있는 다른 셸로 바꿀 수 있습니다. bash 내부에서 bash를 실행하게 되지만, 이는 좋은 해결 방법이 될 수 있습니다.

#! /usr/bin/env python

# do stuff
# install subversion
# do more stuff

# at the point you exit
if everything_went_well:
  import os
  os.putenv('PATH', '/opt/subversion/bin:' + os.environ['PATH'])
  os.execv('/bin/bash', [])

관련 정보