문제

이 질문은 이미 여기에 답이 있습니다.

Python Standard Library에는 쉘 명령에서 사용하기 위해 문자열을 올바르게 구문 분석/비교할 수있는 것이 있습니까? Perl 's에 대한 파이썬 아날로그를 찾고 있습니다 String::ShellQuote::shell_quote:

$ print String::ShellQuote::shell_quote("hello", "stack", "overflow's", "quite", "cool")
hello stack 'overflow'\''s' quite cool

그리고 더 중요한 것은 역 방향으로 작동하는 것 (문자열을 가져 와서 목록으로 분해).

도움이 되었습니까?

해결책

pipes.quote 지금입니다 shlex.quote Python 3에서는 해당 코드를 사용하기가 쉽습니다.

https://github.com/python/cpython/blob/master/lib/shlex.py#l281

이 버전은 제로 길이의 인수를 올바르게 처리합니다.

다른 팁

보입니다

try:  # py3
    from shlex import quote
except ImportError:  # py2
    from pipes import quote

quote("hello stack overflow's quite cool")
>>> '"hello stack overflow\'s quite cool"'

나를 충분히 얻습니다.

파이프가 파손되었고, 제로 길이의 인수를 올바르게 처리하지 않기 때문에 사용해서는 안되며 사용해서는 안됩니다.

>>> from pipes import quote
>>> args = ['arg1', '', 'arg3']
>>> print 'mycommand %s' % (' '.join(quote(arg) for arg in args))
mycommand arg1  arg3

나는 결과가 같은 것 같아야한다고 믿는다

mycommand arg1 '' arg3

Shell 인용을 위해서는 이것이 작동합니다. Posix에서 엄격하게 테스트했습니다. [나는 그것을 가정하고있다 list2cmdline Python이 제공하는 기능은 Windows에 광고 된대로 작동합니다.

# shell.py
import os
if os.name == 'nt':
    from subprocess import list2cmdline

    def quote(arg):
        return list2cmdline([arg])[0]
else:
    import re
    _quote_pos = re.compile('(?=[^-0-9a-zA-Z_./\n])')

    def quote(arg):
        r"""
        >>> quote('\t')
        '\\\t'
        >>> quote('foo bar')
        'foo\\ bar'
        """
        # This is the logic emacs uses
        if arg:
            return _quote_pos.sub('\\\\', arg).replace('\n',"'\n'")
        else:
            return "''"

    def list2cmdline(args):
        return ' '.join([ quote(a) for a in args ])

테스트는입니다 여기, 누군가가 신경 쓰면.

고려하지 않으려면 시도하십시오 shlex.split()

당신은 인용 할 필요가 없어야합니다. 명령을하는 올바른 방법은 쉘 인용을하지 않고 대신 사용하는 것입니다. 하위 프로세스 또는 하위 프로세스 .popen, 인용되지 않은 인수 목록을 통과하십시오. 이것은 쉘 팽창에 면역입니다.

subprocess.Popen(['echo', '"', '$foo'], shell=False)

인용 된 데이터를 고려하지 않으려면 사용할 수 있습니다. Shlex.shlex 이와 같이:

list(shlex.shlex("hello stack 'overflow'\''s' quite cool"))

표준 라이브러리 모듈 하위 프로세스에는 다음에 따라 List2cmdline 함수가 있습니다. 마이크로 소프트 규칙 따라서보다 복잡한 명령 줄을 위해 Unix와 같은 환경에서 얼마나 신뢰할 수 있는지 잘 모르겠습니다.

그만큼 quote기능은 꽤 오랫동안 사용할 수 있습니다 (Python 2.7?) - 주요 단점은 pipe 모듈 shlex 3.2와 3.3 사이.

해당 기능을 가져 오는 동안 두 경우를 모두 처리 할 준비가되어 있어야합니다.

try:
    from shlex import quote
except ImportError:
    from pipes import quote
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top