Hoe voer ik een programma uit Python uit? os.system mislukt vanwege spaties in pad

Ik heb een Python-script dat een extern programma moet uitvoeren, maar om de een of andere reden mislukt.

Als ik het volgende script heb:

import os;
os.system("C:\\Temp\\a b c\\Notepad.exe");
raw_input();

Dan mislukt het met de volgende fout:

‘C:\Temp\a’ wordt niet herkend als een interne of externe opdracht, bruikbaar programma of batchbestand.

Als ik het programma ontsnap met aanhalingstekens:

import os;
os.system('"C:\\Temp\\a b c\\Notepad.exe"');
raw_input();

Dan werkt het. Als ik echter een parameter toevoeg, werkt deze niet meer:

import os;
os.system('"C:\\Temp\\a b c\\Notepad.exe" "C:\\test.txt"');
raw_input();

Wat is de juiste manier om een ​​programma uit te voeren en te wachten tot het klaar is? Ik hoef er geen uitvoer van te lezen, omdat het een visueel programma is dat een taak doet en dan gewoon afsluit, maar ik moet wachten tot het klaar is.

Houd er rekening mee dat het verplaatsen van het programma naar een pad zonder tussenruimten ook geen optie is.


Dit werkt ook niet:

import os;
os.system("'C:\\Temp\\a b c\\Notepad.exe'");
raw_input();

Let op de verwisselde enkele/dubbele aanhalingstekens.

Met of zonder een parameter naar Kladblok hier, het mislukt met de foutmelding

De bestandsnaam, mapnaam of syntaxis van het volumelabel is onjuist.


Antwoord 1, autoriteit 100%

subprocess.callvermijdt problemen met het omgaan met quote-conventies van verschillende shells. Het accepteert een lijst in plaats van een tekenreeks, zodat argumenten gemakkelijker kunnen worden afgebakend. d.w.z.

import subprocess
subprocess.call(['C:\\Temp\\a b c\\Notepad.exe', 'C:\\test.txt'])

Antwoord 2, autoriteit 26%

Hier is een andere manier om het te doen.

Als u Windows gebruikt, werkt het volgende als dubbelklikken op het bestand in Verkenner, of het geven van de bestandsnaam als argument voor het DOS “start”-commando: het bestand wordt geopend met welke toepassing dan ook (indien aanwezig) met de extensie wordt geassocieerd met.

filepath = 'textfile.txt'
import os
os.startfile(filepath)

Voorbeeld:

import os
os.startfile('textfile.txt')

Hiermee wordt textfile.txt geopend met Kladblok als Kladblok is gekoppeld aan .txt-bestanden.


Antwoord 3, autoriteit 11%

De buitenste aanhalingstekens worden door Python zelf gebruikt en de Windows-shell ziet het niet. Zoals hierboven vermeld, begrijpt Windows alleen dubbele aanhalingstekens.
Python converteert forward-slashed naar backslashes op Windows, dus je kunt

os.system('"C://Temp/a b c/Notepad.exe"')

De ‘ wordt gebruikt door Python, die vervolgens “C://Temp/a b c/Notepad.exe” (als een Windows-pad, geen dubbele backslashes nodig) doorgeeft aan CMD.EXE


Antwoord 4, autoriteit 7%

Tenminste in Windows 7 en Python 3.1, wil os.systemin Windows de opdrachtregel dubbele aanhalingstekensals er spaties in het pad naar de opdracht staan. Bijvoorbeeld:

 TheCommand = '\"\"C:\\Temp\\a b c\\Notepad.exe\"\"'
  os.system(TheCommand)

Een voorbeeld uit de praktijk dat me dwars zat, was het klonen van een schijf in VirtualBox. De bovenstaande subprocess.call-oplossing werkte niet vanwege een probleem met toegangsrechten, maar toen ik de opdracht dubbel citeerde, werd os.systemblij:

 TheCommand = '\"\"C:\\Program Files\\Sun\\VirtualBox\\VBoxManage.exe\" ' \
                 + ' clonehd \"' + OrigFile + '\" \"' + NewFile + '\"\"'
  os.system(TheCommand)

Antwoord 5, autoriteit 4%

Voor python moet >= 3.5 subprocess.runworden gebruikt in plaats van subprocess.call

https://docs.python.org/ 3/library/subprocess.html#older-high-level-api

import subprocess
subprocess.run(['notepad.exe', 'test.txt'])

Antwoord 6, autoriteit 3%

import win32api # if active state python is installed or install pywin32 package seperately
try: win32api.WinExec('NOTEPAD.exe') # Works seamlessly
except: pass

Antwoord 7

Ik vermoed dat het hetzelfde probleem is als wanneer je snelkoppelingen gebruikt in Windows… Probeer dit:

import os;
os.system("\"C:\\Temp\\a b c\\Notepad.exe\" C:\\test.txt");

Antwoord 8

Stel dat we uw Django-webserver willen draaien (in Linux) dat er ruimte is tussen uw pad (path='/home/<you>/<first-path-section> <second-path-section>'), dus doe het volgende:

import subprocess
args = ['{}/manage.py'.format('/home/<you>/<first-path-section> <second-path-section>'), 'runserver']
res = subprocess.Popen(args, stdout=subprocess.PIPE)
output, error_ = res.communicate()
if not error_:
    print(output)
else:
    print(error_)

[Opmerking]:

  • Vergeet de toegangsrechten niet: chmod 755 -R <'yor path'>
  • manage.pyis uitvoerbaar: chmod +x manage.py

Antwoord 9

Gebruik voor Python 3.7 subprocess.call. Gebruik onbewerkte tekenreeks om de Windows-paden te vereenvoudigen:

import subprocess
subprocess.call([r'C:\Temp\Example\Notepad.exe', 'C:\test.txt'])

Antwoord 10

Geen subproces nodig, het kan eenvoudig worden bereikt door

GitPath="C:\\Program Files\\Git\\git-bash.exe"# Application File Path in mycase its GITBASH
os.startfile(GitPath)

Other episodes