programing

pyenv 가상 환경에서 실행되는 Python 스크립트에 사용할 shebang

codeshow 2023. 8. 10. 21:42
반응형

pyenv 가상 환경에서 실행되는 Python 스크립트에 사용할 shebang

Python 스크립트가 에서 실행되어야 하는 경우pyenv virtualenv파일에 대한 정확한 셰방은 무엇입니까?

테스트 사례의 예로, 내 시스템(OS X)의 기본 Python은pandas설치된.pyenv 가상 환경 venv_name가상 환경에서 Python 실행 파일의 경로를 가져오려고 했습니다.

pyenv activate venv_name
which python

출력:

/Users/username/.pyenv/shims/python

그래서 나는 나의 본보기를 만들었습니다.script.py:

#!/Users/username/.pyenv/shims/python
import pandas as pd
print 'success'

하지만 스크립트('venv_name' 내에서)를 실행하려고 했을 때 다음 오류가 발생했습니다.

./script.py

출력:

./script.py: line 2: import: command not found
./script.py: line 3: print: command not found

해당 경로를 명령줄에서 직접 실행('venv_name' 내에서)해도 문제가 없습니다.

/Users/username/.pyenv/shims/python script.py

출력:

success

그리고:

python script.py # Also works

출력:

success

이것을 위한 적절한 쉐뱅은 무엇입니까?이상적으로, 저는 그것이 제 현재 venv가 무엇이든 파이썬을 가리키도록 일반적인 것을 원합니다.

저는 왜 당신에게 모든 경로를 가진 통역사에게 전화를 걸어도 안 되는지 잘 모르겠습니다.저는 항상 사용합니다.그러나 사용자 환경에서 Python 인터프리터를 사용하려면 다음 작업을 수행해야 합니다.

#!/usr/bin/env python

사용할 파이썬 인터프리터를 찾기 위해 사용자 환경을 검색하는 방식입니다.

예상한 대로 제어 스크립트의 환경에 관계없이 가상 환경의 Python 실행 파일에 대한 전체 경로를 사용하여 스크립트가 실행되는 환경을 선택/제어할 수 있어야 합니다.

당신의 질문에 대한 댓글에서, VPFB 그리고 당신은 그것을 발견합니다./Users/username/.pyenv/shims/python다음을 수행하는 셸 스크립트입니다.exec $pyenv_python당신은 할 수 있어야 합니다.echo $pyenv_python진짜 파이썬을 결정하고 그것을 셰방으로 사용하는 것.

참고 항목: https://unix.stackexchange.com/questions/209646/how-to-activate-virtualenv-when-a-python-script-starts

해라pyenv virtualenvs가상 환경 디렉터리 목록을 찾습니다.

그런 다음 다음 다음과 같은 사용하는 시방을 찾을 수 있습니다.

#!/Users/username/.pyenv/python/versions/venv_name/bin/python
import pandas as pd
print 'success'

그러면 스크립트가 다른(가상이든 비가상이든) 환경에서 선택한 가상 환경을 사용하여 작동할 수 있습니다.

(venv_name) $ ./script.py
success

(venv_name) $ pyenv activate non_pandas_venv

(non_pandas_venv) $ ./script.py
success

(non_pandas_venv) $ . deactivate

$ ./script.py
success

가상 환경의 Python 바이너리를 구체적으로 호출하면 Python 인터프리터가 해당 바이너리의 경로 위치에서 지원되는 파일을 찾아 주변 가상 환경을 사용하게 됩니다(*가상 환경 작동 방식 참조).

만약 당신이 넣을 수 있는 것보다 더 많은 셸을 사용해야 한다면,#!shebang line, 당신은 같은 파일에서 파이썬을 시작하는 간단한 셸 스크립트로 파일을 시작할 수 있습니다.

#!/bin/bash
"exec" "pyenv" "exec" "python" "$0" "$@"
# the rest of your Python script can be written below

인용문 때문에 Python은 첫 번째 줄을 실행하지 않고 모듈 docstring에 대해 문자열을 함께 결합합니다.그것을 사실상 무시하는 것입니다.

여기서 더 많이 보실 수 있습니다.

환경에 Python 실행 파일이 있는 경우 99%의 경우 다음을 사용하면 됩니다.

#!/usr/bin/env python

정의의venv리눅스에서 동일한 구문을 따르는 것은 나에게 작동하지 않았습니다.venv Python 에 대한 했습니다.venv에서 생성되었기 때문에 다음을 수행해야 했습니다.

#!/path/to/the/venv/bin/python

그러나 기본적으로 터미널에서 파이썬 인터프리터를 호출할 수 있습니다.은 것은당다넣것다입니을에음이신이 뒤에 입니다.#!.

질문에 정확하게 대답하는 것은 아니지만, 제 생각에 에피메트의 이 제안은 당신이 원하는 것을 하는 훨씬 더 나은 방법입니다.이 기능이 어떻게 작동하는지, 사용할 Python 실행 파일을 동적으로 선택할 수 있는지에 대한 설명을 조금 더 자세히 설명했습니다.

#!/bin/sh
#
# Choose the Python executable we need. Explanation:
# a) '''\' translates to \ in shell, and starts a python multi-line string
# b) "" strings are treated as string concatenation by Python; the shell ignores them
# c) "true" command ignores its arguments
# c) exit before the ending ''' so the shell reads no further
# d) reset set docstrings to ignore the multiline comment code
#
"true" '''\'
PREFERRED_PYTHON=/Library/Frameworks/Python.framework/Versions/2.7/bin/python
ALTERNATIVE_PYTHON=/Library/Frameworks/Python.framework/Versions/3.6/bin/python3
FALLBACK_PYTHON=python3

if [ -x $PREFERRED_PYTHON ]; then
    echo Using preferred python $ALTERNATIVE_PYTHON
    exec $PREFERRED_PYTHON "$0" "$@"
elif [ -x $ALTERNATIVE_PYTHON ]; then
    echo Using alternative python $ALTERNATIVE_PYTHON
    exec $ALTERNATIVE_PYTHON "$0" "$@"
else
    echo Using fallback python $FALLBACK_PYTHON
    exec python3 "$0" "$@"
fi
exit 127
'''

__doc__ = """What this file does"""
print(__doc__)
import platform
print(platform.python_version())

pyenv virtualenv를 단순하게 선택하여 단일 스크립트만 사용하려는 경우 다음과 같이 소스가 포함된 Bash 스크립트를 사용할 수 있습니다.

#!/bin/bash
PYENV_VERSION=<your_pyenv_virtualenv_name> python - $@ <<EOF
import sys
print(sys.argv)
exit
EOF

저는 몇 가지 추가 테스트를 했습니다.다음도 작동합니다.

#!/usr/bin/env -S PYENV_VERSION=<virtual_env_name> python

/usr/bin/env python가상 환경에 대해 모르기 때문에 작동하지 않습니다.

당신이 가지고 있다고 가정할 때main.py./venv, 당을은 파이썬에서 .venv디렉토리입니다.다른 말로 하자면, 이 셰방을 사용하세요:

#!venv/bin/python

이제 다음을 수행할 수 있습니다.

./main.py

파일 권한을 확인해야 할 수도 있습니다.

sudo chmod +x script.py

언급URL : https://stackoverflow.com/questions/44076804/what-shebang-to-use-for-python-scripts-run-under-a-pyenv-virtualenv

반응형