programing

한 줄 명령줄에서 여러 줄 문 실행

goodjava 2022. 11. 11. 23:33

한 줄 명령줄에서 여러 줄 문 실행

과 Python을 함께 -c원라이너 루프를 실행한다.

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

이거 잘 돼., for 루프 전에 모듈을 Import하면 다음과 같은 구문 오류가 발생합니다.

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

어떻게 고칠 수 있을까요?

Make file에 포함시킬 수 있도록 원라이너로 하는 것이 중요합니다.

할 수 있다

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

또는 파이프가 없는 경우:

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의 답변.

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

python - <<EOF
import random
for r in range(3): print(random.randint(1, 42))
EOF

또는 하드 탭 포함:

python - <<-EOF
    import random
    for r in range(3): print(random.randint(1, 42))
EOF
# Important: Replace the indentation above w/ hard tabs.

위의 경우 선행 TAB 문자도 삭제됩니다(일부 구조화된 아웃룩을 얻을 수 있습니다).

대신 EOF는 행의 선두에 있는 여기 문서에 표시되지 않는 마커 워드를 견딜 수 있습니다(여기 bash man 페이지 또는 여기 문서 참조).

이 문제는 실제로 수입 명세서가 아닙니다.포루프 전에 있는 모든 것과 관련이 있습니다.더 구체적으로 말하면, 인라인 블록 앞에 나타나는 모든 것.

예를 들어, 다음과 같이 동작합니다.

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

Import가 문제가 되는 경우는, 이것은 유효하지만, 다음과 같이 동작하지 않습니다.

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))"

그러나 lamda는 표현식만 실행할 수 있고 문이나 여러 문은 실행할 수 없으므로 원하는 작업을 수행하지 못할 수 있습니다.단, 제너레이터 식 사이에 목록 이해, lamdas, sys.stdout이 있습니다.글쓰기, "지도" 기본 제공, 그리고 창의적인 문자열 보간으로 강력한 한 줄짜리 작업을 할 수 있습니다.

, 에서 작은 하는 .py'make file'은 'make file'은 'make file?


- 이 답변을 Python 3.x에서도 사용할 수 있도록 하려면print함수로 호출됩니다. 3.x에서만 print('foo') 2.x 는 「 2.x 」도 받아들입니다.print 'foo'.
Windows 를 포함한 크로스 플랫폼의 관점에서는, kxr 편리한 회답을 참조해 주세요.

, 또는 의 경우:

ANSI C 따옴표로 둘러싸인 문자열을 사용합니다( ).$'...'할 수 있습니다.\n에 실제 .python:

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

해 주세요.\nimport ★★★★★★★★★★★★★★★★★」for줄 바꿈에 영향을 주는 문.

이러한 명령어에 셸 변수 값을 전달하려면 인수사용하여 를 사용하여 액세스 하는 것이 가장 안전합니다.sys.argvPython 스 python python :

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) 이중 따옴표로 둘러싸인 명령어스트링을 사용하는 경우의 장점과 단점에 대해서는, 이하를 참조해 주세요.

$'...'★★★★★★★★★★★★★★★★★★:

  • ★★★ \인스턴스가 원래 소스 코드에 포함되어 있습니다.
    • \<char> - "- " 등\n 또, 「이 경우」나 「이 경우」.\t,\r,\b - 확장자$'...').man printf★★★★★★★★★★★★★★★★★★★★★」
  • '를 ""로 지정합니다.\'.

POSIX 준거를 유지할 필요가 있는 경우:

printf명령어 치환:

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

이런 유형의 문자열을 안전하게 사용하려면:

  • ★★★ \인스턴스가 원래 소스 코드에 포함되어 있습니다.
    • \<char> - "- " 등\n 또, 「이 경우」나 「이 경우」.\t,\r,\b - 확장자printf).man printf(지원되는 이스케이프시퀀스)를 참조해 주세요.
  • 따옴표로 둘러싸인 문자열을 전달하다printf %b삽입된 작은 따옴표를 생략할 수 있습니다. '\''

    • 작은 따옴표를 사용하면 셸에 의한 해석으로부터 문자열의 내용을 보호할 수 있습니다.

      • 즉, 짧은 Python 스크립트의 경우(이 경우처럼) 이중 따옴표로 둘러싸인 문자열을 사용하여 셸 변수 값을 스크립트에 통합할 수 있습니다. 관련 함정(다음 포인트 참조)을 알고 있으면 셸이 확장됩니다.$HOME에서의 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★하다

        • python -c "$(printf %b "import sys\nfor r in range(10): print('rob is $HOME')")"
      • 단, 일반적으로 선호되는 접근법은 인수를 통해 셸에서 값을 전달하고 이를 통해 접근합니다.sys.argv파이썬

        • python -c "$(printf %b 'import sys\nfor r in range(10): print("rob is " + sys.argv[1])')" "$HOME"
    • 큰따옴표로 묶은 문자열을 사용하는 것이 더 편리하지만 에스케이프 없이 포함된 작은따옴표로 묶은 큰따옴표를 사용할 수 있습니다.\"- 또한 이 문자열은 에 의해 해석될 수 있으며, 이는 의도일 수도 있고 의도되지 않을 수도 있습니다.$ ★★★★★★★★★★★★★★★★★」`소스 코드에 셸을 의도하지 않은 문자가 있으면 구문 오류가 발생하거나 문자열이 예기치 않게 변경될 수 있습니다.

      • 조개껍데기 의 가가 addition addition addition addition addition addition addition addition addition 。\예를 들어 Python이 리터럴 출력을 생성하도록 하기 위해 큰따옴표로 묶인 문자열의 처리가 방해가 될 수 있습니다.ro\b 안 됩니다.ro\\b에 대응하다'...'셸 스트링과 더블 \를를,, 음음음음음음음음
        python -c "$(printf %b 'import sys\nprint("ro\\\\bs")')" # ok: 'ro\bs'
        이와는 대조적으로, 이것은, 에서는 의도한 대로 동작하지 않습니다."..." 스트링 "syslog":
        python -c "$(printf %b "import sys\nprint('ro\\\\bs')")" # !! INCORRECT: 'rs'
        셸은 양쪽을 해석합니다. "\b" ★★★★★★★★★★★★★★★★★」"\\b"문자 그대로의 '''로\b 수의 \"CHANGE: "CHANGE: "CHANGE: "CHANGE: "CHANGE:
        python -c "$(printf %b "import sys\nprint('ro\\\\\\\\bs')")"

코드를 전달하지 않고-c:

주의: 여기서는 한 줄짜리 솔루션에 초점을 맞추고 있습니다.여기서 xorho의 답변은 여러 줄짜리 문서를 사용하는 방법을 보여줍니다.단, 구분자는 반드시 인용하십시오.<<'EOF'다만, 셸이 명시적으로 스트링을 앞으로 전개하는 것을 원하지 않는 한(상기 주의사항이 첨부되어 있습니다).


, 또는 의 경우:

ANSI C 따옴표로 묶은 문자열($'...'여기에 문자열( )을 붙입니다.<<<...

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

-pythonstdin에서 읽도록 명시적으로 지정합니다(기본값으로 읽습니다). -이 경우 는 옵션이지만 인수를 스크립트에 전달하는 경우에도 스크립트파일 이름에서 인수를 명확하게 하기 위해 이 인수가 필요합니다.

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'

이걸 어떻게 고칠 수 있는지 알아?

는 Python Python 스테이트먼트로 때문에 합니다.;는 모두 한 줄짜리 "small statement"로만 사용할 수 있습니다.Python 문서의 문법 파일에서 다음을 수행합니다.

stmt: simple_stmt | compound_stmt
simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
small_stmt: (expr_stmt | del_stmt | pass_stmt | flow_stmt |
             import_stmt | global_stmt | nonlocal_stmt | assert_stmt)

다른 수 에 이렇게 하면 . 따라서 이 작업을 수행합니다.-c깃발은 매우 불편해진다.

bash 쉘 환경에서 Python을 시연할 때 복합문을 포함하면 매우 유용합니다.이것을 확실하게 하는 유일한 간단한 방법은 유전체(posix shell thing)를 사용하는 것입니다.

헤레독

유전체 사용(로 작성)<<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파라미터 및 산술 확장을 방지합니다.이것은 유전을 더 강하게 만든다.

Bash 다중 행 문자열

이중 따옴표를 사용하면 셸 확장을 얻을 수 있습니다.

$ python -c "
> import sys
> for p in '$PATH'.split(':'):
>     print(p)
> "
/usr/sbin
/usr/bin
/sbin
/bin
...

셸 확장을 방지하려면 단일 따옴표를 사용합니다.

$ python -c '
> import sys
> for p in "$PATH".split(":"):
>     print(p)
> '
$PATH

Python의 리터럴에서 따옴표 문자를 교환해야 합니다.기본적으로 BASH에 의해 해석되는 따옴표는 사용할 수 없습니다.Python에서와 같이 교대로 사용할 수 있지만, 이미 상당히 혼란스러워 보이기 때문에 이것을 권장하지 않습니다.

$ python -c '
import sys
for p in "'"$PATH"'".split(":"):
    print(p)
'
/usr/sbin
/usr/bin
/sbin
/bin
...

승인된 답변(및 기타)에 대한 비판

읽기 어려운 내용입니다.

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

읽기 어렵고 오류 발생 시 디버깅도 어렵습니다.

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

좀 더 읽기 쉽지만, 그래도 꽤 못생겼을지도 모른다.

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

가지고 있으면 혼날 거야"는 python python python에

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

map또는 컴포넌트를 나열하여 취득할 수 있습니다.

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

이것들은 모두 슬프고 나쁘다.하지 마.

를 사용하여 다음 행에 입력합니다.

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

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

정상적으로 동작합니다.

for 루프를 인라인 하려면 , 「 」를 사용합니다.

는 이 문제가 .importPython 명령어로 입니다.문제는 제어 흐름 문이 Python 인터프리터 명령어로 인라인 처리되지 않는다는 것입니다.import스테이트먼트와 다른 스테이트먼트를 조합하면, 같은 문제가 발생합니다.

생각해 보세요: Python은 모든 것을 인라인으로 만들 수 없습니다.들여쓰기를 사용하여 제어 플로우를 그룹화합니다.

시스템이 POSIX.2에 준거하고 있는 경우는,printf유틸리티:

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

zap
rob
rob
rob

이 변형은 파이프 없이 Windows 및 Unix와 유사한 시스템인 Python 2 및 Python 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') """)

Unix와 유사한 시스템의 Bash는 다음과 같습니다.

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"""

저는 그다지 큰 Pythoner는 아니지만, 한번은 이 구문을 찾았는데 어디서 왔는지 잊어버렸기 때문에 문서화해야겠다고 생각했습니다.

사용하시는 경우sys.stdout.write대신print(차이: 괄호 안의 인수를 함수로 받아들인다-그렇지 않다)한 줄의 경우 명령어와 명령어의 순서를 반전시키는 것으로 회피할 수 있습니다.for세미콜론을 삭제하고 명령어를 대괄호로 묶습니다.다음은 예를 제시하겠습니다.

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

Python에서는 이 구문을 어떻게 불러야 할지 모르겠습니다.


한 줄의 각 괄호는 "목록 통합"입니다. 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()- 괄호 안의 명령어가 실행됩니다(출력의 "disclosed"에 주의).

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()명령어가 실행되도록 하려면 명령어는 할당 즉시 실행됩니다.다만, 이후의 검사에서는,aNone:

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

출력:

abc
[None]

대괄호 케이스에 대해서는 이 페이지에서 찾을 수 있는 정보가 별로 없습니다만, 다음과 같이 설명하고 있습니다.

Python Tips And Tricks – 초판 - Python Tutorials | Dream.In.코드:

참고로 단일 라인 생성기의 표준 형식은 대괄호 내부의 일종의 단일 라인 '포' 루프입니다.이렇게 하면 한 방향으로만 반복할 수 있고 끝에 도달하면 다시 사용할 수 없는 '원샷' 반복 가능한 개체가 생성됩니다.

목록 이해'는 일반 대괄호( )가 대괄호 [ ]로 대체된다는 점을 제외하고는 일반 한 줄 제너레이터와 거의 동일합니다.목록 이해의 주요 장점은 '원샷' 반복 가능한 객체가 아닌 '목록'을 생성한다는 것입니다. 따라서 당신은 그것을 앞뒤로 오갈 수 있고 요소를 추가하거나 정렬할 수 있습니다.

실제로 목록입니다. 실행되자마자 첫 번째 요소가 아무것도 되지 않습니다.

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 Compensions - Python v2.7.4 문서에서는 "List Compensions는 목록을 만드는 간결한 방법을 제공합니다."라고 기술되어 있습니다.아마 여기서 목록의 제한된 "실행 가능성"이 한 줄에 적용됩니다.

음, 제가 너무 빗나간 게 아니길 바랍니다...

다음은 두 개의 비내스트 포루프(list comprehibration)가 포함된 한 줄 명령어 라인입니다. 두 줄 모두 "목록 이해" 대괄호로 둘러싸여 있습니다.

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]

두 번째 "목록"은bfor 루프가 명시적으로2회 실행되었기 때문에, 현재는 2개의 요소가 있습니다.단, 그 결과sys.stdout.write()두 경우 모두 (적절하게)None.

single/double quotes그리고.backslash모든 장소:

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

훨씬 더 나은 기능:

python -c '
import sys
for i in range(10):
  print("bob")
'

주의: 일부 시스템에서는 실행 가능python는 Python 2용이며 사용할 수 없을 수 있습니다.실행 가능python3Python 3용입니다.

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

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

저는 다음과 같은 속성을 가진 솔루션을 원했습니다.

  1. 읽을 수 있다
  2. 다른 도구의 출력을 처리하기 위한 표준 입력을 읽습니다.

두 가지 요건 모두 다른 답변에서는 제공되지 않았기 때문에 명령줄에서 모든 작업을 수행하면서 표준 입력을 읽는 방법은 다음과 같습니다.

grep special_string -r | sort | python3 <(cat <<EOF
import sys
for line in sys.stdin:
    tokens = line.split()
    if len(tokens) == 4:
        print("%-45s %7.3f    %s    %s" % (tokens[0], float(tokens[1]), tokens[2], tokens[3]))
EOF
)

이 작업을 수행해야 할 때는 다음과 같이 했습니다.

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

sys.stdout의 새 줄에 대한 3중 백슬래시를 적어 둡니다.명세서를 작성하다

표준 입력을 터치하여 "http://cmdfile.py"을 통과한 것처럼 시뮬레이션하지 않으려면 Bash 쉘에서 다음 작업을 수행합니다.

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

보시는 바와 같이 표준 입력을 사용하여 입력 데이터를 읽을 수 있습니다.내부적으로 셸은 입력 명령어 내용의 임시 파일을 만듭니다.

사용하다python -c세 개의 따옴표로 묶음:

python -c """
import os
os.system('pwd')
os.system('ls -l')
print('Hello, World!')
for _ in range(5):
    print(_)
"""

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

cat somefile.log|sys-c "import sys;[ sys . stdin sys 、 sys . stdout の line ]기입(행*2)]"

언급URL : https://stackoverflow.com/questions/2043453/executing-multi-line-statements-in-the-one-line-command-line