4

인수 목록이 있습니다. ["hello", "bobbity bob", "bye"]. 어떻게 이들을 적절하게 쉘에 전달할 수 있습니까?파이썬에서 인수 목록에서 셸 명령 줄을 포맷하는 방법

잘못된 :

>>> " ".join(args) 
hello bobbity bob bye 

올바른 :

은 구식 방법 뭐가 잘못
>>> magic(args) 
hello "bobbity bob" bye 
+0

당신이 어떤 인수가 따옴표' "'포함될 수 있습니다 때 경우를 처리해야합니까 '의? s 또는 백 슬래시'\ '' – SingleNegationElimination

+0

@TokenMacGuy : 예 .. 기본적으로 정확히 어떻게 popen으로 전달 될지 알고 싶지만 명령 줄로 사용하십시오 – Claudiu

답변

12
당신은 문서화되지 않은 있지만, 장기 안정 (적어도 since Oct 2004) subprocess.list2cmdline 사용할 수

:

In [26]: import subprocess 
In [34]: args=["hello", "bobbity bob", "bye"] 

In [36]: subprocess.list2cmdline(args) 
Out[36]: 'hello "bobbity bob" bye' 
+0

아 완벽한 ... 정확히 무엇 나는 원했다. 나는 그것이 왜 문서화되어 있지 않은지 궁금합니다. – Claudiu

+0

+1, 당신은 내 마음을 날려 버렸습니다! – SingleNegationElimination

0

:

>>> args = ["hello", "bobbity bob", "bye"] 
>>> s = "" 
>>> for x in args: 
...  s += "'" + x + "' " 
... 
>>> s = s[:-1] 
>>> print s 
'hello' 'bobbity bob' 'bye' 

그것은 단일 경우 문제가되지 않습니다 단어 인수는 좋은데.

+0

더 나은 방법이 있습니다! = P – Claudiu

+0

이러한 인수에 대해 작동하지만 가능합니다. 인수에 작은 따옴표가 포함될 수있는 경우 보안 문제를 포함하여 문제가 발생할 수 있습니다. – Stef

1

문제를 해결하는 가장 쉬운 방법은 텍스트에 두 단어 이상이있을 때 \ "... \"를 추가하는 것입니다. 당신을 위해

# Update the list 
for str in args: 
    if len(str.split(" ")) > 2: 
    # Update the element within the list by 
    # Adding at the beginning and at the end \" 

    ... 

# Print args 
" ".join(args)