한 줄 명령 줄에서 여러 줄 문을 실행 하시겠습니까?


197

-c1-liner 루프를 실행하기 위해 Python을 사용 하고 있습니다.

$ 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에 포함시킬 수 있도록 이것을 하나의 라이너로 만드는 것이 중요합니다.


이것이 귀하의 질문에 대답합니까? 사전을 사용하여 실행할 기능 선택
pfabri

답변:


182

넌 할 수있어

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


마지막 옵션은 Windows의 python3에서 잘 작동합니다
Ian Ellis

1
@RudolfOlah는 지금까지 그것을 알고 있기를 바라지 만 참고를 위해 다음과 같이 python3 + 버전의 인쇄 문장을 포장해야합니다.python -c "exec(\"import sys\nfor r in range(10): print('rob')\")"
systrigger

@systrigger 감사합니다, 나는 서두에 있다고 생각하고 그 사실을

89

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

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 맨 페이지 또는 here의 문서 참조 ).


9
좋은. 인수 를 전달하려면 그 뒤에 인수 를 두십시오 <<EOF. 그러나 여기서 문서 의 내용을 선행 확장 으로부터 보호하려면 구분 기호 를 인용 하는 것이 좋습니다 ( 예 :-). <<'EOF'
mklement0

56

문제는 실제로 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))"

그러나 람다는 명령문이나 여러 명령문이 아닌 표현식 만 실행할 수 있으므로 원하는 작업을 계속 수행하지 못할 수 있습니다. 그러나 생성자 표현식, 목록 이해, 람다, sys.stdout.write, "map"내장 및 일부 창의적인 문자열 보간 사이에 강력한 단일 라이너를 수행 할 수 있습니다.

문제는 얼마나 멀리 가고 싶고, 어떤 시점에서 .pymakefile이 실행 하는 작은 파일 을 작성하는 것이 낫지 않습니까?


31


- 파이썬이 응답 작업을하려면 3.X을 뿐만 아니라, printA와 호출 기능 : 3.X에서, 단지 print('foo') 작동 2.X도 받아 반면 print 'foo'. -Windows
를 포함하는 크로스 플랫폼 관점 은 kxr의 유용한 답변을 참조하십시오 .

에서 bash, ksh또는zsh :

문자열이 전달되기 전에 실제 개행으로 확장되는 개행을 나타내는 데 사용할 수 있는 ANSI C 인용 문자열 ( $'...')을 사용 \n하십시오 python.

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

노트 \n사이 importfor줄 바꿈에 영향을하기 위해 문을.

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

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

포함 된 쉘 변수 참조 와 함께 (이스케이프 시퀀스 사전 처리 된) 큰 따옴표로 묶인 명령 문자열 을 사용하는 장단점에 대한 설명은 아래를 참조하십시오.

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

  • 원래 소스 코드 \에서 더블 인스턴스 .
    • \<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같은 임베디드 작은 따옴표 탈출 '\'' (원문 참조).

    • 작은 따옴표를 사용하면 이 문자열 내용을 해석하지 못하도록 보호합니다 .

      • 즉, 짧은 파이썬 스크립트 (이 경우와 같이)의 경우에는 큰 함정 문자열을 사용하여 변수 값을 스크립트 에 통합 할 수 있습니다 . 예를 들어, 쉘 $HOME은 현재 사용자의 홈 디렉토리로 확장 됩니다. 다음 명령에서 :

        • python -c "$(printf %b "import sys\nfor r in range(10): print('rob is $HOME')")"
      • 그러나 일반적으로 선호되는 접근 방식은 arguments 를 통해 쉘에서 값을 전달 sys.argv하고 Python을 통해 값 에 액세스하는 것입니다 . 위의 명령과 동일합니다 :

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

      • 또한 \큰 따옴표로 묶인 셸에서 셸 자체 처리가 방해 될 수 있습니다. 예를 들어, 파이썬 이 리터럴 출력을 생성하게 ro\b하려면 전달 ro\\b해야합니다. 로모그래퍼 '...'쉘 문자열과 두 배로 \ 경우, 우리는 얻을 :
        python -c "$(printf %b 'import sys\nprint("ro\\\\bs")')" # ok: 'ro\bs'
        반면에,이 수행 되지 로모그래퍼 의도 한대로 작업을 "..."쉘 문자열 :
        python -c "$(printf %b "import sys\nprint('ro\\\\bs')")" # !! INCORRECT: 'rs'
        쉘 해석 모두 "\b""\\b"문자 등의 \b추가의 현기증 번호 요구, \원하는 효과를 달성하기 위해 인스턴스를 :
        python -c "$(printf %b "import sys\nprint('ro\\\\\\\\bs')")"

하기 를 통해 코드를 전달stdin 보다는 -c:

참고 : 여기서는 단일 회선 솔루션 에 중점을두고 있습니다. xorho의 답변 은 여러 줄로 된 here-document 를 사용하는 방법을 보여줍니다 . 그러나 구분 기호 를 인용 하십시오. 예를 들어, <<'EOF'쉘에서 명시 적으로 문자열을 확장하지 않으려는 경우 (위의 경고와 함께 제공)


에서 bash, ksh또는zsh :

결합 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 호환 상태를 유지해야하는 경우 :

stdin을 통해 출력을 전달하기 위해 파이프 라인printf 과 함께 위와 같이 사용하십시오 .

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'

2
이것이 선출 된 답변이어야합니다!
debuti

1
이것은 또한 작동하며 아마도 완전한 설명, 브라보를 포함하기 때문에 아마도 가장 좋은 대답 일 것입니다 !

22

이것이 어떻게 고칠 수 있는지 아십니까?

으로 구분 된 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 쉘 환경에서 파이썬을 시연 할 때 복합 문장을 포함시키는 것이 매우 유용하다는 것을 알았습니다. 이것을 확실하게 수행하는 유일한 간단한 방법은 heredocs (posix shell 일)를 사용하는 것입니다.

Heredocs

용도 히어 닥 (로 만든 <<)과 파이썬의 명령 줄 인터페이스 옵션을 , -:

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

-<<( <<-)를 추가하면 을 사용 하여 들여 쓸 수 있습니다 (Stackoverflow는 탭을 공백으로 변환하므로 이것을 강조하기 위해 8 칸을 들여 쓰기했습니다). 선행 탭이 제거됩니다.

탭없이 다음과 같이 할 수 있습니다 <<.

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

인용 부호를 넣으면 매개 변수산술 확장이EOF 방지 됩니다 . 이것은 heredoc을 더 강력하게 만듭니다.

배쉬 여러 줄 문자열

큰 따옴표를 사용하면 셸 확장이 나타납니다.

$ 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

파이썬에서 리터럴에서 따옴표 문자를 교체해야합니다. 기본적으로 BASH가 해석하는 따옴표 문자는 사용할 수 없습니다. 우리는 파이썬에서와 같이 그것들을 대체 할 수 있습니다. 그러나 이것은 이미 혼란스러워 보입니다. 그래서 나는 이것을 권장하지 않습니다 :

$ 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 -c "import sys
> for r in range(10): print 'rob'"

mapfor-loops를 얻기 위해 이해를 남용 하거나 나열 하지 마십시오 .

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

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


3
문법 정보를위한 ++; 확장되지 않는 here-doc은 편리하고 가장 강력한 솔루션이지만 분명히 하나의 라이너가 아닙니다. 한 줄 솔루션은 ANSI C-인용 문자열을 사용하여 필수 인 경우 ( bash, ksh또는 zsh) 합리적인 솔루션입니다 : python -c $'import sys\nfor r in range(10): print(\'rob\')'(당신은 단지 작은 따옴표를 이스케이프에 대해 걱정할 필요가 (당신이 따옴표를 사용하여 피할 수있는)하고 있습니다 백 슬래시).
mklement0

14

return을 사용하고 다음 줄에 입력하십시오.

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

6
진지하게, 당신이 이것을 계속한다면 뭔가 염좌를하게 될 것입니다. python $(srcdir)/myscript.py큰 정의.
Jason Orendorff

10

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

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


9

문제는 import진술에 있지 않습니다 . 문제는 제어 흐름 문이 파이썬 명령에서 인라인으로 작동하지 않는다는 것입니다. 해당 import문장을 다른 문장으로 바꾸면 같은 문제가 나타납니다.

파이썬은 모든 것을 인라인 할 수는 없습니다. 들여 쓰기를 사용하여 제어 흐름을 그룹화합니다.


7

시스템이 Posix.2를 준수하는 경우 printf유틸리티를 제공해야 합니다.

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

2
좋은 해결책이지만 입력 문자열의 (형식 지정자) 와 같은 시퀀스를 해석 printf %b '...' | python하지 못하므로 견고성을 높이는 것이 좋습니다 . 또한 파이썬 명령 문자열에 셸 확장을 명시 적으로 적용하지 않으려는 경우 (혼란이 생길 ​​수 있음) 셸이 적용되는 확장 및 백래시 처리를 피하기 위해 외부 인용에 (작은 따옴표) 를 사용하는 것이 좋습니다 큰 따옴표로 묶습니다. printf%d'
mklement0

5

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

그래서. 많은. 보다 나은.
Marc

4

(11 : 23 23 '10 at 19:48) 나는 실제로 큰 Pythoner는 아니지만-이 구문을 한 번 발견했는데 어디서 왔는지 잊었으므로 문서화 할 것이라고 생각했습니다.

sys.stdout.write대신 차이점 을 사용하면 print( 괄호 안에 인수를 함수로 사용하지만 인수는 사용 하지 않음 ) 한 줄짜리 명령의 경우 명령 순서를 반전 하고 세미콜론을 제거하면됩니다. 명령을 대괄호로 묶습니다.sys.stdout.writeprintfor

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

이 구문이 파이썬에서 어떻게 호출되는지 모릅니다. :)

도움이 되었기를 바랍니다,

건배!


(편집 화요일 4 월 9 일 20시 57 분 30 초) 글쎄, 나는 마침내 한 줄짜리에있는 대괄호가 무엇인지 발견했다고 생각합니다. 그들은 "목록 이해력"(명백히)입니다; 먼저 파이썬 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()하면 명령을 실행하기 위해 호출 할 필요가 없으므로 할당 즉시 실행됩니다. 그러나 나중에 검사 결과 aNone다음과 같습니다.

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

이것은 대괄호의 경우에 대한 정보를 많이 남기지 않지만-나는이 페이지를 우연히 발견했다고 설명합니다.

파이썬 팁과 트릭 – 초판-Python Tutorials | 드림 인 코드 :

리콜하면 단일 라인 생성기의 표준 형식은 괄호 안에있는 한 줄의 'for'루프입니다. 이렇게하면 한 방향으로 만 반복 할 수 있고 끝까지 도달 한 후에는 재사용 할 수없는 '원샷'반복 가능 객체가 생성됩니다.

'목록 이해력'은 일반 괄호 ()가 대괄호 ([])로 대체된다는 점을 제외하면 일반 한 줄 생성기와 거의 같습니다. alist 이해의 주요 이점은 'one-shot'반복 가능한 객체가 아닌 'list'를 생성하여 앞뒤로 이동하고 요소를 추가하고 정렬하는 등의 작업을 수행 할 수 있다는 것입니다.

그리고 실제로 목록입니다. 실행되는 즉시 첫 번째 요소가 없습니다.

$ 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. 리스트 이해 — 파이썬 v2.7.4 문서 "리스트 이해는리스트를 생성하는 간결한 방법을 제공합니다"; 아마도,리스트의 제한된 "실행 가능성"이 한 줄짜리에서 실행되는 곳일 것입니다.

글쎄, 내가 여기서 너무 많이 표시되지 않기를 바랍니다.

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

$ 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()두 경우 의 결과 는 (분명히) None였습니다.


4

이 변형은 파이프가없는 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"""

크로스 플랫폼 각도와 변환기의 경우 ++. 첫 번째 명령은 이식성 측면에서 얻을 수있는만큼 우수하지만 (PowerShell 제외) 궁극적으로 큰 따옴표를 사용해야 할 경우 원치 않는 셸 확장의 위험이 있기 때문에 완전히 강력한 단일 플랫폼 간 구문이 없습니다. POSIX 형 쉘과 다른 문자를 이스케이프해야하는 Windows PowerShell v3 이상 --%에서는 command-string 인수 앞에 "stop-parsing"옵션을 삽입하여 명령 줄을 작동시킬 수 있습니다 .
mklement0

@ mklement0 " 원치 않는 쉘 확장 ": 글쎄, 쉘 확장을 print "path is %%PATH%%"resp 와 같은 것으로 삽입 . print "path is $PATH"일반적으로 플랫폼에서 평소대로 탈출하지 않는 한 일반적으로 스크립트 또는 명령 행에서 원하는 옵션입니다. 다른 언어와 동일합니다. (파이썬 구문 자체는 정기적으로 %와 $를 사용하는 것을 제안하지는 않습니다.)
kxr

쉘 변수 참조를 파이썬 소스 코드에 직접 삽입하면 정의에 따라 이식성이 없습니다. 내 요점은 그 대신에 플랫폼 별 참조를 구성하는 경우에도 별도의 당신이 통과하는 것이 변수 인수로 A와 하나의 "쉘이없는" 즉, 파이썬 명령 할 수있다 당신이 이중 인용 된 문자열을 보호 할 수 없기 때문에, 작업 항상하지 이식을 : 예를 들어, 파이썬 코드에 리터럴 이 필요한 경우 어떻게해야 $foo합니까? \$fooPOSIX와 같은 쉘의 이점을 위해 이스케이프 처리 cmd.exe하면 여전히 추가 정보가 표시 \ 됩니다. 드물지만 알만한 가치가 있습니다.
mklement0

Windows PowerShell 에서이 작업을 시도하지만 문제는 python -c exec ( "" "..." "") 코드를 실행할 수 있는지 여부에 관계없이 출력을 생성하지 않는다는 것입니다. 또는 아닙니다; 나는 거기에 어떤 횡설수설을 넣을 수 있었고 결과는 같습니다. 쉘이 stdout과 stderr 스트림을 모두 "먹고"있는 것처럼 느낍니다. 어떻게 뱉어 낼 수 있습니까?
Yury

2

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

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


다른 도구를 사용하지 말고 고칠 무언가가 필요하다고 생각합니다. 어쨌든 좋은 힌트
enrico.bacis

@ enrico.bacis에 동의하지만이 답변을 추가하게되어 기쁩니다. 이 질문에 대답 나는 내가이 페이지를 봤 때 가지고 있습니다.
tbc0

1

이 작업을 수행해야 할 때

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

sys.stdout.write 문에서 줄 바꿈에 대한 트리플 백 슬래시를 확인하십시오.


이 작품,하지만 당신은 사용하고 있기 때문에 echo -e비표준이며, 요구하는 bash, ksh또는 zsh, 당신이뿐만 아니라 사용할 수 있습니다 $'...'또한 탈출 단순화, 직접 문자열을 :python -c $'import sys\nsys.stdout.write("Hello World!\\n")'
mklement0

이 답변은 작동하지만 다른 답변은 Python3에서 작동하지 않습니다

1

다음 속성을 가진 솔루션을 원했습니다.

  1. 읽을 수있는
  2. 다른 툴의 출력 처리를위한 표준 읽기

두 가지 요구 사항은 다른 답변에서 제공되지 않았으므로 명령 줄에서 모든 것을 수행하면서 stdin을 읽는 방법은 다음과 같습니다.

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
)

0

sys.stdout.write에는 옵션이 하나 더 있으며 None을 반환하여 목록을 비 웁니다.

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


0

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

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

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


++ 스크립트 자체와 함께 stdin을 "사용하지"않기위한 것 ( -c "$(...)"동일 하지만 POSIX 호환); <(...)구조체에 이름 을 부여하기 위해 : 프로세스 치환 ; 또한 작동 ksh하고 zsh.
mklement0
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.