Shellquote/Unshellquote에 대한 파이썬 모듈? [복제하다
문제
이 질문은 이미 여기에 답이 있습니다.
- OS.System () 호출을 피하는 방법? 10 답변
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