복붙노트

[PYTHON] 한 줄 명령 줄에서 파이썬 다중 행 구문 실행하기

PYTHON

한 줄 명령 줄에서 파이썬 다중 행 구문 실행하기

나는 파이썬을 -c와 함께 사용하여 one-liner 루프를 실행한다.

$ python -c "for r in range(10): print 'rob'"

이것은 잘 작동합니다. 그러나 for 루프 앞에 모듈을 가져 오면 구문 오류가 발생합니다.

$ python -c "import sys; for r in range(10): print 'rob'"
  File "<string>", line 1
    import sys; for r in range(10): print 'rob'
              ^
SyntaxError: invalid syntax

이 문제를 어떻게 해결할 수 있습니까?

한 줄짜리로 만들어서 Makefile에 넣을 수있게하는 것이 중요합니다.

해결법

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

    1.너 할 수있어.

    너 할 수있어.

    echo -e "import sys\nfor r in range(10): print 'rob'" | python
    

    또는 w / out 파이프 :

    python -c "exec(\"import sys\\nfor r in range(10): print 'rob'\")"
    

    또는

    (echo "import sys" ; echo "for r in range(10): print 'rob'") | python
    

    또는 @ SilentGhost의 대답 / @ Crast의 대답

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

    2.이 스타일은 makefile에서도 사용될 수 있습니다. (사실 아주 자주 사용됩니다).

    이 스타일은 makefile에서도 사용될 수 있습니다. (사실 아주 자주 사용됩니다).

    python - <<EOF
    import sys
    for r in range(3): print 'rob'
    EOF
    

    또는

    python - <<-EOF
        import sys
        for r in range(3): print 'rob'
    EOF
    

    후자의 경우 선도 탭 문자도 제거됩니다 (일부 구조화 된 전망을 얻을 수 있음)

    EOF 대신에 라인 시작 부분에 here 문서에 나타나지 않는 마커 단어를 사용할 수 있습니다 (여기 bash 맨 페이지 또는 여기에있는 문서를 참고하십시오).

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

    3.이 문제는 실제로 import 문과 관련이 없으며 for 루프 앞에있는 것이 있습니다. 또는 더 구체적으로 인라인 블록 앞에 나타나는 모든 것.

    이 문제는 실제로 import 문과 관련이 없으며 for 루프 앞에있는 것이 있습니다. 또는 더 구체적으로 인라인 블록 앞에 나타나는 모든 것.

    예를 들어, 다음 모든 것들이 가능합니다 :

    python -c "import sys; print 'rob'"
    python -c "import sys; sys.stdout.write('rob\n')"
    

    임포트가 명령문이되는 것이 문제라면, 이것은 효과가 있지만 그렇게하지는 않습니다 :

    python -c "__import__('sys'); for r in range(10): print 'rob'"
    

    아주 기본적인 예제에서는 다음과 같이 다시 작성할 수 있습니다.

    python -c "import sys; map(lambda x: sys.stdout.write('rob%d\n' % x), range(10))"
    

    그러나 람다는 명령문이나 다중 명령문이 아닌 표현식 만 실행할 수 있으므로 원하는 작업을 수행 할 수없는 경우도 있습니다. 그러나 생성기 표현식, 목록 이해, lambdas, sys.stdout.write, "내장"맵핑 및 일부 창조적 인 문자열 보간 사이에는 강력한 단일 행을 수행 할 수 있습니다.

    문제는 얼마나 멀리 가고 싶은지, 그리고 언제 makefile이 대신 실행하는 작은 .py 파일을 작성하는 것이 좋지 않다는 것입니다.

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

    4.-이 대답을 파이썬 3.x에서도 사용할 수있게하려면 print가 함수로 호출됩니다. 3.x에서는 print ( 'foo') 만 작동하지만 2.x는 print 'foo'도 허용합니다. - Windows가 포함 된 플랫폼 간 관점에 대해서는 kxr의 유용한 답변을 참조하십시오.

    -이 대답을 파이썬 3.x에서도 사용할 수있게하려면 print가 함수로 호출됩니다. 3.x에서는 print ( 'foo') 만 작동하지만 2.x는 print 'foo'도 허용합니다. - Windows가 포함 된 플랫폼 간 관점에 대해서는 kxr의 유용한 답변을 참조하십시오.

    bash, ksh 또는 zsh에서 :

    문자열이 파이썬에 전달되기 전에 \ n을 사용하여 실제 줄 바꿈으로 확장 된 줄 바꿈을 나타낼 수있는 ANSI C 인용 문자열 ($ '...')을 사용하십시오.

    python -c $'import sys\nfor r in range(10): print("rob")'
    

    줄 바꿈을 적용하려면 import와 for 문 사이의 \ n에주의하십시오.

    이러한 명령에 쉘 변수 값을 전달하려면 인수를 사용하고 Python 스크립트 내에서 sys.argv를 통해 액세스하는 것이 가장 안전합니다.

    name='rob' # value to pass to the Python script
    python -c $'import sys\nfor r in range(10): print(sys.argv[1])' "$name"
    

    쉘 변수 참조가 포함 된 (escape sequence-preprocessed) 큰 따옴표로 묶인 명령 문자열 사용의 장단점에 대한 논의는 아래를 참조하십시오.

    $ '...'문자열을 사용하여 안전하게 작업하려면 :

    POSIX를 준수해야하는 경우 :

    명령 대체와 함께 printf를 사용하십시오.

    python -c "$(printf %b 'import sys\nfor r in range(10): print("rob")')"
    

    이 유형의 문자열로 안전하게 작업하려면 다음을 수행하십시오.

    -c가 아닌 stdin을 통해 코드를 전달하려면 :

    참고 : 여기서는 단일 회선 솔루션에 중점을 둡니다. xorho의 답변은 여기에 여러 줄짜리 문서를 사용하는 방법을 보여줍니다. 단, 구분 기호를 인용해야합니다. (예 : 위에서 언급 한 경고와 함께 제공되는) 문자열을 앞쪽으로 확장하려는 경우가 아니라면 << 'EOF'와 같이.

    bash, ksh 또는 zsh에서 :

    ANSI C 인용 문자열 ($ '...')과 here-string (<<< ...)을 결합하십시오.

    python - <<<$'import sys\nfor r in range(10): print("rob")'
    

    - 파이썬이 stdin (명시 적으로 읽음)을 읽도록 명시 적으로 지시합니다. -이 경우 선택 사항이지만 스크립트에 인수를 전달하려는 경우 스크립트 파일 이름에서 인수를 명확히하기 위해 필요합니다.

    python - 'rob' <<<$'import sys\nfor r in range(10): print(sys.argv[1])'
    

    POSIX를 준수해야하는 경우 :

    printf를 위와 같이 사용하지만 파이프 라인을 사용하면 stdin을 통해 출력을 전달할 수 있습니다.

    printf %b 'import sys\nfor r in range(10): print("rob")' | python
    

    인수로 :

    printf %b 'import sys\nfor r in range(10): print(sys.argv[1])' | python - 'rob'
    
  5. ==============================

    5.return을 사용하여 다음 행에 입력하십시오.

    return을 사용하여 다음 행에 입력하십시오.

    user@host:~$ python -c "import sys
    > for r in range(10): print 'rob'"
    rob
    rob
    ...
    
  6. ==============================

    6.여러분의 문제는;로 구분 된 파이썬 문장이 "작은 문장"으로 만 허용된다는 사실에 의해 만들어집니다. 파이썬 문서의 문법 파일에서 :

    여러분의 문제는;로 구분 된 파이썬 문장이 "작은 문장"으로 만 허용된다는 사실에 의해 만들어집니다. 파이썬 문서의 문법 파일에서 :

    복합 명령문은 세미콜론을 통해 다른 명령문과 같은 행에 포함될 수 없습니다. 따라서 -c 플래그로 이것을 수행하는 것은 매우 불편합니다.

    배쉬 쉘 환경에서 파이썬을 시연 할 때, 나는 복합 문장을 포함하는 것이 매우 유용하다는 것을 알았다. 이 작업을 수행하는 유일한 방법은 heredocs를 사용하는 것입니다.

    heredoc (<<로 작성)과 Python의 명령 행 인터페이스 옵션 인 - :을 사용하십시오.

    $ python - <<-"EOF"
            import sys                    # 1 tab indent
            for r in range(10):           # 1 tab indent
                print('rob')              # 1 tab indent and 4 spaces
    EOF
    

    - << (the << -) 뒤에 탭을 추가하면 탭을 들여 쓰기 할 수 있습니다 (Stackoverflow는 탭을 공백으로 변환하므로이를 강조하기 위해 8 개의 들여 쓰기를했습니다). 선행 탭이 제거됩니다.

    <<없이 탭 없이도 할 수 있습니다.

    $ python - << "EOF"
    import sys
    for r in range(10):
        print('rob')
    EOF
    

    EOF를 따옴표로 묶으면 매개 변수 및 산술 확장이 방지됩니다. 이것은 heredoc을보다 강력하게 만듭니다.

    이것은 매우 읽을 수 없습니다 :

    오류가 발생해도 쉽게 읽을 수 없으며 디버깅하기가 어렵습니다.

    아마도 좀 더 읽기 쉽지만 여전히보기 흉한 것 같습니다.

    파이썬에 ""있는 것이 있으면 시간이 많이 걸릴 것입니다.

    for-loops를 얻기 위해 map이나 list comprehension을 남용하지 마십시오 :

    이들은 모두 슬프고 나쁘다. 그들을하지 마십시오.

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

    7.문제는 import 문과 관련이 없습니다. 문제는 컨트롤 흐름 문이 파이썬 명령에서 인라인으로 작동하지 않는다는 것입니다. 해당 import 문을 다른 명령문으로 바꾸면 동일한 문제가 나타납니다.

    문제는 import 문과 관련이 없습니다. 문제는 컨트롤 흐름 문이 파이썬 명령에서 인라인으로 작동하지 않는다는 것입니다. 해당 import 문을 다른 명령문으로 바꾸면 동일한 문제가 나타납니다.

    그것에 대해 생각해보십시오. 파이썬은 모든 것을 인라인 할 수 없습니다. 들여 쓰기를 사용하여 제어 흐름을 그룹화합니다.

  8. ==============================

    8.시스템이 Posix.2와 호환되면 printf 유틸리티를 제공해야합니다.

    시스템이 Posix.2와 호환되면 printf 유틸리티를 제공해야합니다.

    $ printf "print 'zap'\nfor r in range(3): print 'rob'" | python
    zap
    rob
    rob
    rob
    
  9. ==============================

    9.$ python2.6 -c "r (범위 내에서 sys.stdout.write ( 'rob \ n') 가져 오기 sys]] '

    $ python2.6 -c "r (범위 내에서 sys.stdout.write ( 'rob \ n') 가져 오기 sys]] '

    잘 작동합니다. for 루프를 인라인하려면 "[]"을 사용하십시오.

  10. ==============================

    10.(답변 11 월 23 일 10시 19 분 48 초) 저는 실제로 큰 파이썬 너가 아닙니다. 그러나이 구문을 한 번 발견 했으므로 어디에서 왔는지 잊어 버렸습니다. 그래서 문서화 할 것이라고 생각했습니다.

    (답변 11 월 23 일 10시 19 분 48 초) 저는 실제로 큰 파이썬 너가 아닙니다. 그러나이 구문을 한 번 발견 했으므로 어디에서 왔는지 잊어 버렸습니다. 그래서 문서화 할 것이라고 생각했습니다.

    만약 print 대신에 sys.stdout.write를 사용하면 (차이는 sys.stdout.write는 인수를 함수로 취하고 괄호 안에 - print는 그렇지 않다) 한 줄이면 반전 할 수 있습니다 명령 및 명령의 순서, 세미콜론을 제거하고 명령을 대괄호로 묶습니다. 예 :

    python -c "import sys; [sys.stdout.write('rob\n') for r in range(10)]"
    

    이 구문이 파이썬에서 어떻게 호출 될지 전혀 모르겠다. :)

    희망이 도움이,

    건배!

    (EDIT Tue Apr 9 20:57:30 2013) 글쎄, 마침내 한 줄짜리 대괄호가 무엇인지 알아 냈다. 그들은 "목록 내포"(외관상으로는)이다; 먼저 Python 2.7에서 이것을주의하십시오.

    $ STR=abc
    $ echo $STR | python -c "import sys,re; a=(sys.stdout.write(line) for line in sys.stdin); print a"
    <generator object <genexpr> at 0xb771461c>
    

    따라서 둥근 괄호 / 괄호 안에있는 명령어는 "생성자 객체"로 간주됩니다. next ()를 호출하여 "반복"하면 괄호 안의 명령이 실행됩니다 (출력에서 "abc"에주의하십시오).

    $ echo $STR | python -c "import sys,re; a=(sys.stdout.write(line) for line in sys.stdin); a.next() ; print a"
    abc
    <generator object <genexpr> at 0xb777b734>
    

    대괄호를 사용한다면 명령을 실행하기 위해 next ()를 호출 할 필요가 없다는 점에주의하십시오. 할당시 즉시 실행됩니다. 그러나 나중에 검사하면 a가 없음임을 알 수 있습니다.

    $ echo $STR | python -c "import sys,re; a=[sys.stdout.write(line) for line in sys.stdin]; print a"
    abc
    [None]
    

    이것은 대괄호의 경우를 찾기 위해 많은 정보를 남기지 않습니다. 그러나 제가 생각하기에이 페이지를 우연히 발견했습니다 :

    파이썬 팁과 트릭 - 초판 - 파이썬 자습서 | Dream.In.Code :

    그리고 사실 그것은 목록입니다. 첫 번째 요소는 실행되는 즉시 아무 것도 아닌 요소가됩니다.

    $ echo $STR | python -c "import sys,re; print [sys.stdout.write(line) for line in sys.stdin].__class__"
    abc
    <type 'list'>
    $ echo $STR | python -c "import sys,re; print [sys.stdout.write(line) for line in sys.stdin][0]"
    abc
    None
    

    리스트 내포는 다른 방법으로 5에 문서화되어있다. 데이터 구조 : 5.1.4. List Comprehensions - "List comprehensions은 목록을 만드는 간결한 방법을 제공합니다"라는 Python v2.7.4 문서; 아마도 그것이 목록의 제한된 "실행 가능성"이 한 - 라이너에서 작용하게 될 것입니다.

    글쎄, 내가 여기 너무 끔찍하지 않다면 ...

    EDIT2 : 여기에는 중첩되지 않은 두 개의 for-loops가있는 한 줄짜리 명령 줄이 있습니다. 둘 다 "목록 이해"대괄호 안에 들어 있습니다.

    $ echo $STR | python -c "import sys,re; a=[sys.stdout.write(line) for line in sys.stdin]; b=[sys.stdout.write(str(x)) for x in range(2)] ; print a ; print b"
    abc
    01[None]
    [None, None]
    

    두 번째 "목록"b는 이제 for 루프가 명시 적으로 두 번 실행 되었기 때문에 두 개의 요소를가집니다. 그러나 두 경우 모두 sys.stdout.write ()의 결과는 (분명히) 없음이었습니다.

  11. ==============================

    11.이 변종은 파이프없이 Windows 및 * nix, py2 / 3의 명령 줄에 멀티 라인 스크립트를 넣는 데 가장 유용합니다.

    이 변종은 파이프없이 Windows 및 * nix, py2 / 3의 명령 줄에 멀티 라인 스크립트를 넣는 데 가장 유용합니다.

    python -c "exec(\"import sys \nfor r in range(10): print('rob') \")"
    

    (지금까지 본 다른 예제들 중 어느 것도 그렇게하지 않았다.)

    Windows의 기본 개념은 다음과 같습니다.

    python -c exec"""import sys \nfor r in range(10): print 'rob' """
    python -c exec("""import sys \nfor r in range(10): print('rob') """)
    

    bash / * nix는 다음과 같습니다.

    python -c $'import sys \nfor r in range(10): print("rob")'
    

    이 함수는 다중 라인 스크립트를 이식 가능한 명령 행 라이너로 변환합니다.

    def py2cmdline(script):
        exs = 'exec(%r)' % re.sub('\r\n|\r', '\n', script.rstrip())
        print('python -c "%s"' % exs.replace('"', r'\"'))
    

    용법:

    >>> py2cmdline(getcliptext())
    python -c "exec('print \'AA\tA\'\ntry:\n for i in 1, 2, 3:\n  print i / 0\nexcept:\n print \"\"\"longer\nmessage\"\"\"')"
    

    입력 :

    print 'AA   A'
    try:
     for i in 1, 2, 3:
      print i / 0
    except:
     print """longer
    message"""
    
  12. ==============================

    12.작은 따옴표와 큰 따옴표 및 백 슬래시 :

    작은 따옴표와 큰 따옴표 및 백 슬래시 :

    $ python -c 'exec("import sys\nfor i in range(10): print \"bob\"")'
    

    훨씬 낫다:

    $ python -c '
    > import sys
    > for i in range(10):
    >   print "bob"
    > '
    
  13. ==============================

    13.이 스크립트는 Perl과 같은 명령 행 인터페이스를 제공합니다.

    이 스크립트는 Perl과 같은 명령 행 인터페이스를 제공합니다.

    Pyliner - 명령 행에서 임의의 Python 코드를 실행하는 스크립트 (Python recipe)

  14. ==============================

    14.하나 더 많은 옵션이 있습니다. sys.stdout.write는 None을 반환하며, 이는 목록을 비워 둡니다.

    하나 더 많은 옵션이 있습니다. sys.stdout.write는 None을 반환하며, 이는 목록을 비워 둡니다.

    cat somefile.log | python -c "import sys; [sys.stdout.write (line * 2) 인 경우 sys.stdin의 행]]"

  15. ==============================

    15.이에 대한 간단한 웹 페이지를 작성했습니다. 거기에 여러 줄로 된 코드를 붙여 넣을 수 있으며이 줄은 작동하는 한 줄 문장으로 변환됩니다.

    이에 대한 간단한 웹 페이지를 작성했습니다. 거기에 여러 줄로 된 코드를 붙여 넣을 수 있으며이 줄은 작동하는 한 줄 문장으로 변환됩니다.

    파이썬 싱글 라인 변환기

  16. ==============================

    16."python cmdfile.py"를 전달한 것처럼 stdin을 처리하고 시뮬레이트하지 않으려면 bash 쉘에서 다음을 수행하십시오.

    "python cmdfile.py"를 전달한 것처럼 stdin을 처리하고 시뮬레이트하지 않으려면 bash 쉘에서 다음을 수행하십시오.

    $ python  <(printf "word=raw_input('Enter word: ')\nimport sys\nfor i in range(5):\n    print(word)")
    

    보시다시피 stdin을 사용하여 입력 데이터를 읽을 수 있습니다. 내부적으로 쉘은 입력 명령 내용에 대한 임시 파일을 작성합니다.

  17. ==============================

    17.이 작업을 수행해야 할 때

    이 작업을 수행해야 할 때

    python -c "$(echo -e "import sys\nsys.stdout.write('Hello World!\\\n')")"
    

    sys.stdout.write 문에서 줄 바꿈에 대한 세 개의 백 슬래시를 확인하십시오.

  18. from https://stackoverflow.com/questions/2043453/executing-python-multi-line-statements-in-the-one-line-command-line by cc-by-sa and MIT license