2016-03-31 11 views
0

Um einen Befehl in Python, für Windows, ich mache:Befehl über subprocess unter Windows mit Leerzeichen in Dateinamen

import subprocess 
subprocess.check_output(lsCommand, shell=True) 

wo lsCommand ist eine Liste von Strings, die den Bash-Befehl bilden. Dies funktioniert, außer wenn es einige Eingaben mit Leerzeichen enthält. Zum Beispiel das Kopieren eines Namens + Wechsel:

Um zu versuchen und tun cp "test 123" test123:

lsCommand = ['cp', 'test 123', 'test123'] 
subprocess.check_output(lsCommand, shell=True) 

schlägt fehl, weil es denkt, dass ich versuche, cp "test" "123" test123 zu tun. Error (Google Storage Sachen zu tun):

python: can't open file 'c:\GSUtil\gsutil.py cp -n gs://folderl/test': [Errno 22] Invalid argument 

Dann versuche ich

subprocess.check_output('cp "test 123" test123', shell=True) 

Same Scheiße. Irgendwelche Ideen?

+1

Warum verwenden Sie 'shell = True'? Gegeben eine Liste ohne 'shell = True' sollte funktionieren, denke ich. – zondo

+0

@zondo nicht auf Windows, nein. Linux yay – Roman

+0

Siehe auch http://StackOverflow.com/Questions/3172470/actual-meaning-of-shell-true-in-subprocess – tripleee

Antwort

0

cp ist kein internal command und Sie brauchen daher nicht shell=True (though you might need to specify a full path to cp.exe).

Die interne Schnittstelle zum Starten eines neuen Unterprozesses unter Windows verwendet eine Zeichenfolge, d. H. Es liegt an der spezifischen Anwendung, wie eine Befehlszeile zu interpretieren ist.

#!/usr/bin/env python 
from subprocess import check_call 

check_call(['cp', 'test 123', 'test123']) 

Wenn Sie shell=True dann das Programm verwenden möchten, die in der Befehlszeile interpretiert ist cmd.exe und Sie sollten seine Flucht Regeln (e.g., ^ is a meta-character) und geben Sie den Befehl als Zeichenfolge verwenden wie: The default MS C runtime rules (imlemented in subprocess.list2cmdline() that is called implicitly if you pass a list on Windows) sollte in diesem Fall funktionieren (wie Sie sehen es in der Windows-Konsole):

check_call('copy /Y /B "test 123" test123', shell=True) 

Offensichtlich Sie nicht brauchen, um einen externen Prozess zu starten, um copy a file in Python:

import shutil 

shutil.copy('test 123', 'test123') 
0

für Ubuntu:

subprocess.check_output(['list', 'of', 'commands with spaces']) 

für Windows:

subprocess.check_output('single command "string with spaces"') 

Vielen Dank für Informationen, die ich shell=True nicht brauchen.

Verwandte Themen