2012-04-11 8 views
0

Also ich versuche, ein Skript zu schreiben, das die Befehlszeile in Windows verwenden wird, und es ist standardmäßig eine Struktur, die in meinem Python-Verzeichnis ist - ich will das nicht. Ich versuche, auf das richtige Verzeichnis zuzugreifen

import subprocess 
import time 
subprocess.call(r"""Cscript %windir%/System32/Printing_Admin_Scripts/en-US/Prnport.vbs -a -r "saturn.print.mediag.com" -h "saturn.print.mediag.com" -o raw""") 
time.sleep(5) 
subprocess.call(r"""rundll32 printui.dll, PrintUIEntry /if /b "Saturn" /f w:\printers\toshibae3511\eng\est_c2.inf /r "saturn.print.mediag.com" /m "TOSHIBA e-STUDIO Color PS3""") 
raw_input("press any key to exit") 

Der erste Teilprozess Aufruf sollte das Skript prnport.vbs in c ausführen: \ Windows \ System32, etc, etc, aber stattdessen geht es c zu mögen: \ python27 \ projects \ Drucker-Setup \% windir% \ system32, etc usw.

Wie mache ich es zum richtigen Verzeichnis, das (obwohl wahrscheinlich nicht) pro Computer variieren kann?

Antwort

1

Sie müssen Umgebungsvariablen verwenden, um windir zu erhalten,% WINDIR% wird nicht auf den Wert erweitert, den Sie erwarten, also wird davon ausgegangen, dass es relativ zum aktuellen Arbeitsverzeichnis ist. Sie können os.environ["WINDIR"] oder os.getenv("WINDIR", "default_value"), verwenden Sie nach: this link

Ich bin nicht sicher, ob es das ist, ich bin nicht auf Windows, aber Sie brauchen etwas ähnliches:

import os 
windir = os.environ["WINDIR"] 
subprocess.call(r'Cscript %s/System32/Printing_Admin_Scripts/en-US/Prnport.vbs -a -r "saturn.print.mediag.com" -h "saturn.print.mediag.com" -o raw' % (windir,)) 

und dreifache Anführungszeichen „“ „für mehrere Zeilen Sie brauchen sie nicht für eine einzelne Zeile Verwendung" oder“

Andernfalls würden Sie das aktuelle Arbeitsverzeichnis ändern mit:

import os 
os.chdir('C:\\Windows\\Sytem32\\') 
subprocess.call(r'Cscript ./System32/Printing_Admin_Scripts/en-US/Prnport.vbs -a -r "saturn.print.mediag.com" -h "saturn.print.mediag.com" -o raw') 
2

Sie müssen os.path.expandvars auf dem Pfad verwenden, um "% windir%" zu ersetzen.

Auch abgesehen von der Frage, es ist besser, eine Liste der Argumente zu übergeben, nicht eine einzige lange Kette zu subprocess.call, dh

subprocess.call(['rundll32', 'printui.dll'...]) 
+0

@ Andrew-alexander Oder den Parameter 'shell = true' in dem Teilprozess .call, was so hässlich ist wie die Verwendung einer einzelnen Zeichenfolge anstelle einer Liste. : P – KurzedMetal

Verwandte Themen