shebang #!/usr/bin/env python
을 사용하여 스크립트를 실행할 때 시스템은 어떤 python
것을 사용 해야하는지 어떻게 알 수 있습니까? 내가 찾는 경우 python
환경 변수에 빈 경로 나는 아무것도 찾을 수 없습니다.
env | grep -i python
답변
shebang은 해석기가 사용할 전체 경로를 예상하므로 다음 구문이 올바르지 않습니다.
#!python
다음과 같이 전체 경로를 설정하면 작동 할 수 있습니다.
#!/usr/local/bin/python
파이썬은에 설치되어있을 수 있습니다으로하지만, 비 휴대용 것 /bin
, /opt/python/bin
다른 위치를, 또는 어디든지.
사용 env
#!/usr/bin/env python
는 이식 가능한 방법으로 OS에 python
처음으로 위치한 경로와 동일한 전체 경로를 OS에 지정할 수있는 방법 PATH
입니다.
답변
당면한의 ( “날카로운 쾅”, 즉, 행 라인 #!
)은 커널에 의해 처리된다. 커널은와 같은 환경 변수에 대해 알고 싶지 않습니다 PATH
. 따라서 shebang 행의 이름은 실행 파일의 절대 경로 여야합니다. 스크립트 이름 앞에 해당 실행 파일에 전달할 추가 인수를 지정할 수도 있습니다 (시스템 종속 제한 사항은 여기서 다루지 않습니다). 예를 들어 Python 스크립트의 경우 다음을 지정할 수 있습니다.
#!/usr/bin/python
첫 번째 줄에서 스크립트를 실행하면 실제로 커널이 실행 /usr/bin/python /path/to/script
됩니다. 그러나 편리하지 않습니다. 명령의 전체 경로를 지정해야합니다. 당신은 어떤 경우 python
에 /usr/bin
일부 시스템에서와 /usr/local/bin
다른 사람? 또는 당신은 당신을 설정할 PATH
하기 /home/joe/opt/python-2.5/bin
때문에 파이썬의 특정 버전을 사용하기로? 커널은 PATH
당신을 위해 검색을 하지 않기 때문에, 커널은 다음 명령에서 원하는 인터프리터를 찾는 명령을 실행하도록하는 것입니다 PATH
.
#!/fixed/path/to/path-lookup-command python
즉 path-lookup-command
인수로 실행 파일의 이름을 가지고 그것을 찾아 있어야 PATH
하고 실행 : 커널이 실행됩니다 /fixed/path/to/path-lookup-command python /path/to/script
. 그것이 일어날 때, env
명령은 바로 그 일을합니다. 주요 목적은 다른 환경에서 명령을 실행하는 것이지만에서 명령 이름을 조회하므로 $PATH
여기서는 목적에 완벽합니다.
비록 이것이 공식적으로 보장되지는 않지만, 유닉스 시스템 과 현대 시스템 env
에서 제공되는 역사적인 유닉스 시스템 /usr/bin
은의 광범위한 사용으로 인해 그 위치를 정확하게 유지했습니다 #!/usr/bin/env
. 따라서 실제로 사용자가 선호하는 Python 인터프리터가 스크립트를 실행하도록 지정하는 방법은 다음과 같습니다.
#!/usr/bin/env python
답변
그렇습니다.
env | grep PATH
$ PATH는 디렉토리 목록입니다. 유닉스는 “파이썬”을 찾을 때까지 그 디렉토리 목록을 순서대로 살펴 본다.
‘which’명령으로 찾은 디렉토리를 확인할 수 있습니다.
which python