복붙노트

[PYTHON] "#! / usr / bin / env python"을 사용하여 파이썬에 인수를 전달할 수 없습니다.

PYTHON

"#! / usr / bin / env python"을 사용하여 파이썬에 인수를 전달할 수 없습니다.

필자는 직접 실행 가능한 파이썬 스크립트가 있어야하므로 #! / usr / bin / env python으로 파일을 시작했습니다. 그러나, 나는 또한 unbuffered 출력이 필요하므로 #! / usr / bin / env python -u를 시도했지만 python -u와 함께 실패합니다 : 해당 파일이나 디렉토리가 없습니다.

# / usr / bin / python -u가 작동한다는 것을 알았지 만, 가상 환경 환경을 지원하기 위해 PATH에서 파이썬을 얻으려면 필요합니다.

내 옵션은 무엇입니까?

해결법

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

    1.이를 가능하게하려면 환경 변수를 사용하는 것이 좋습니다. python 문서보기 : http://docs.python.org/2/using/cmdline.html

    이를 가능하게하려면 환경 변수를 사용하는 것이 좋습니다. python 문서보기 : http://docs.python.org/2/using/cmdline.html

    귀하의 경우 :

    export PYTHONUNBUFFERED=1
    script.py
    
  2. ==============================

    2.어떤 환경에서는 env가 인수를 분리하지 않습니다. 그래서 당신의 env는 당신의 경로에 "python -u"를 찾고 있습니다. sh를 사용하면 문제를 해결할 수 있습니다. Shebang을 다음 코드 줄로 바꾸면 모든 것이 잘될 것입니다.

    어떤 환경에서는 env가 인수를 분리하지 않습니다. 그래서 당신의 env는 당신의 경로에 "python -u"를 찾고 있습니다. sh를 사용하면 문제를 해결할 수 있습니다. Shebang을 다음 코드 줄로 바꾸면 모든 것이 잘될 것입니다.

    #!/bin/sh
    ''''exec python -u -- "$0" ${1+"$@"} # '''
    # vi: syntax=python
    

    추신. sh에 대한 경로를 걱정할 필요가 없습니다.

  3. ==============================

    3.Linux에서 shebang을 사용하면 인터프리터 이름 다음의 나머지 줄 전체가 단일 인수로 해석됩니다. python -u는 마치 / usr / bin / env 'python -u'와 같이 env로 전달됩니다. / usr / bin / env는 python -u라는 바이너리를 검색합니다.이 바이너리는 없습니다.

    Linux에서 shebang을 사용하면 인터프리터 이름 다음의 나머지 줄 전체가 단일 인수로 해석됩니다. python -u는 마치 / usr / bin / env 'python -u'와 같이 env로 전달됩니다. / usr / bin / env는 python -u라는 바이너리를 검색합니다.이 바이너리는 없습니다.

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

    4.shebang 행에 인수를 전달하는 것은 표준이 아니며 실험 한대로 Linux에서 env와 함께 작동하지 마십시오. bash를 사용하는 솔루션은 내장 명령 "set"을 사용하여 필수 옵션을 설정하는 것입니다. 파이썬 명령을 사용하여 표준 입력 버퍼링되지 않은 출력을 설정하기 위해 동일한 작업을 수행 할 수 있다고 생각합니다.

    shebang 행에 인수를 전달하는 것은 표준이 아니며 실험 한대로 Linux에서 env와 함께 작동하지 마십시오. bash를 사용하는 솔루션은 내장 명령 "set"을 사용하여 필수 옵션을 설정하는 것입니다. 파이썬 명령을 사용하여 표준 입력 버퍼링되지 않은 출력을 설정하기 위해 동일한 작업을 수행 할 수 있다고 생각합니다.

    my2c

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

    5./ bin / bash를 기반으로하는 해쉬 - 뱅 (hash-bang) 행에 인수를 전달하고 실행 파일 경로에서 공백을 허용하지 않는다는 제한과 함께 / usr / bin / env에 대한 스크립트가 있습니다. 나는 그것을 "envns"(env No Spaces)라고 부른다.

    / bin / bash를 기반으로하는 해쉬 - 뱅 (hash-bang) 행에 인수를 전달하고 실행 파일 경로에서 공백을 허용하지 않는다는 제한과 함께 / usr / bin / env에 대한 스크립트가 있습니다. 나는 그것을 "envns"(env No Spaces)라고 부른다.

    #!/bin/bash
    
    ARGS=( $1 )  # separate $1 into multiple space-delimited arguments.
    shift # consume $1
    
    PROG=`which ${ARGS[0]}`
    unset ARGS[0] # discard executable name
    
    ARGS+=( "$@" ) # remainder of arguments preserved "as-is".
    exec $PROG "${ARGS[@]}"
    

    이 스크립트가 / usr / local / bin / envns에 있다고 가정 할 때, 여기에 당신의 shebang 줄이 있습니다 :

    #!/usr/local/bin/envns python -u
    

    우분투 13.10 및 cygwin x64에서 테스트되었습니다.

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

    6.이것은 약간 구식일지도 모르지만 env (1) 매뉴얼은 그 경우에 '-S'를 사용할 수 있다고 알려줍니다

    이것은 약간 구식일지도 모르지만 env (1) 매뉴얼은 그 경우에 '-S'를 사용할 수 있다고 알려줍니다

    #!/usr/bin/env -S python -u
    

    FreeBSD에서 꽤 잘 작동하는 것 같습니다.

  7. ==============================

    7.이것은 kludge이며 bash가 필요하지만 작동합니다 :

    이것은 kludge이며 bash가 필요하지만 작동합니다 :

    #!/bin/bash
    
    python -u <(cat <<"EOF"
    # Your script here
    print "Hello world"
    EOF
    )
    
  8. ==============================

    8.래리 카이 (Larry Cai)의 답을 바탕으로 env를 사용하면 명령 줄에서 직접 변수를 설정할 수 있습니다. 이는 -u가 파이썬 이전의 PYTHONUNBUFFERED 설정으로 대체 될 수 있음을 의미합니다.

    래리 카이 (Larry Cai)의 답을 바탕으로 env를 사용하면 명령 줄에서 직접 변수를 설정할 수 있습니다. 이는 -u가 파이썬 이전의 PYTHONUNBUFFERED 설정으로 대체 될 수 있음을 의미합니다.

    #!/usr/bin/env PYTHONUNBUFFERED="YESSSSS" python
    

    RHEL 6.5에서 작동합니다. 나는 env의 기능이 거의 보편적이라는 것을 확신한다.

  9. ==============================

    9.나는 최근에이 문제를 다루기 위해 env의 GNU Coreutils 버전을위한 패치를 작성했다.

    나는 최근에이 문제를 다루기 위해 env의 GNU Coreutils 버전을위한 패치를 작성했다.

    http://lists.gnu.org/archive/html/coreutils/2017-05/msg00018.html

    이걸 가지고 있다면 다음과 같이 할 수 있습니다 :

    #!/usr/bin/env :lang:--foo:bar
    

    env는 lang : foo : - bar를 lang, foo 및 --bar 필드로 나눕니다. 인터프리터 lang에 대해 PATH를 검색 한 다음 --foo, bar 및 스크립트의 경로와 스크립트의 인수를 사용하여 호출합니다.

    옵션 중간에 스크립트의 이름을 전달하는 기능도 있습니다. lang -f other-arg를 실행하고 나머지 인수를 실행한다고 가정합니다. 이 패치 된 env를 사용하면 다음과 같이 수행됩니다.

    #!/usr/bin/env :lang:-f:{}:other-arg
    

    {}에 해당하는 가장 왼쪽의 필드는 뒤 따르는 첫 번째 인수로 바뀌고, 해시 뱅 호출에서 스크립트 이름입니다. 그 인수는 다음 제거됩니다.

    여기서 other-arg는 lang에 의해 처리되거나 스크립트에 의해 처리되는 무언가 일 수 있습니다.

    더 잘 이해하려면 패치에있는 수 많은 에코 테스트 사례를 참조하십시오.

    필자는 : 문자를 POSIX 시스템의 PATH에 사용되는 기존 분리 문자로 선택했습니다. env는 PATH 검색을하기 때문에 이름에 콜론이 포함 된 프로그램에 대해서는 거의 사용되지 않습니다. {} 마커는 find 유틸리티에서 가져옵니다. find 유틸리티는 경로를 -exec 명령 행에 삽입하는 것을 나타 내기 위해 find 유틸리티를 사용합니다.

  10. from https://stackoverflow.com/questions/3306518/cannot-pass-an-argument-to-python-with-usr-bin-env-python by cc-by-sa and MIT license