Python3 Program in cmd ausführen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
AlexE
User
Beiträge: 5
Registriert: Samstag 20. März 2021, 10:15

Sonntag 21. März 2021, 09:14

Hallo zsammen,

ich bin ein absoluter Anfänger in Sache Python und stehe nun vor einem Problem wo ich mal etwas input brauche.

ich möchte ein Program welches sich über CMD aufrufen lässt von python ausführen lassen.

Seit 3 Tagen probiere ich alle mögliche Codeschnipsel aus, leider ohne Erfolg.

in der Batch wird das Program wie folgt ausgeführt. Hierbei werden die conf und die*nwd an die exe übergeben.

Code: Alles auswählen

C:\Program Files\Autodesk\Navisworks Manage 2021\FiletoolsTaskRunner.exe /i 'pfad\conig.txt' /of pfad\ausgabedatei.nwd
Sowohl die conf, als auch der Codestring habe ich fertig. Sogar inklusive SQL Anbindung ;)

jetzt möchte ich str_config und str_paht als variablen an die exe in einer CMD übergeben.

Print gibt den String so aus wie ich in der CMD brauche.

Code: Alles auswählen

C:/Program Files/Autodesk/Navisworks Manage 2021/FiletoolsTaskRunner.exe /i Y:/12_Projekte/FAIR/_Entwickungsumgebung/python/fairtool/tmp/Y:/12_Projekte/FAIR/_Entwickungsumgebung/python/fairtool/tmp/G0702A.tmp /of Y:/12_Projekte/FAIR/_CAD_DATEN_FAIR/_Navisworks_Projekte/FT-G702-NW-0000002.nwd
ich habe es bisher mit os.system cmd versucht, hier wird aber entweder der Pfad oder die variablen angemeckert.

Kann mir evtl jemand erklären mit welchem modul ich das ganze an CMD übergeben kann?


Gruß Alex
pycoding.de
User
Beiträge: 3
Registriert: Montag 22. März 2021, 12:59

Montag 22. März 2021, 13:12

Du bist auf Windows oder?
Benutzeravatar
DeaD_EyE
User
Beiträge: 599
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Dienstag 23. März 2021, 14:40

Code: Alles auswählen

import shlex
import subprocess


cmd = [
    r"C:\Program Files\Autodesk\Navisworks Manage 2021\FiletoolsTaskRunner.exe",
    r"/i", "pfad\conig.txt",
    r"/of", "pfad/ausgabedatei.nwd",
]


cmd2 = shlex.split(r"'C:/Program Files/Autodesk/Navisworks Manage 2021/FiletoolsTaskRunner.exe' /i Y:/12_Projekte/FAIR/_Entwickungsumgebung/python/fairtool/tmp/Y:/12_Projekte/FAIR/_Entwickungsumgebung/python/fairtool/tmp/G0702A.tmp /of Y:/12_Projekte/FAIR/_CAD_DATEN_FAIR/_Navisworks_Projekte/FT-G702-NW-0000002.nwd")


print(cmd2)


# subprocess.run(cmd)
# subprocess.run(cmd2)
Bitte auch gleich in der Dokumentation nachsehen was shlex.split macht und was subprocess.run macht.
os.popen, os.system soll man nicht mehr benutzen, da es veraltet ist.


PS: Aufgrund der Backslashes habe ich regex-strings verwendet. Der prefix r sorgt dafür, dass nur noch \" und \' interpretiert werden, aber alles andere durch \ nicht. z.B. ist \b das Steuerzeichen für bell. Man kann auch die normalen Schrägstriche verwenden. Viel besser ist noch die Verwendung von pathlib.Path.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
AlexE
User
Beiträge: 5
Registriert: Samstag 20. März 2021, 10:15

Donnerstag 8. April 2021, 16:22

Arsch über mein Haupt das ich mich jetzt erst melde.

Danke für die Hilfestellung. Habe es inzwischen realisieren können mit os.system lösen können.

Will das ganze aber noch auf subprocess.call umbauen, bin aber dazu noch nicht gekommen.

Hier das Ergebnis, wenn noch was auffällt nur raus damit.

Code: Alles auswählen

import subprocess
import os


def func_nwx(str_prog,config,path):

    os.system(('%sFiletoolsTaskRunner.exe.lnk /i \"%s" /of \"%s"') % (str_prog,config,path))
PS. Jup unter Windoof, ein teile der Module laufen aber in LNX.

Gruß Alex
Sirius3
User
Beiträge: 14210
Registriert: Sonntag 21. Oktober 2012, 17:20

Donnerstag 8. April 2021, 18:20

func_nwx ist ein bescheidener Name. Dass es eine Funktion ist, ist klar, weil man das Ding ja aufruft. nwx ist eine kryptische Abkürzung, aber Code sollte einem nicht solche Rätsel stellen.
Bei str_prog hat das str nichts verloren, weil klar ist, dass ein Programmname ein String ist.
Wobei das von deinem Code aus eher wie ein Pfad aussieht.
Und statt os.system solltest Du subprocess.run benutzen und statt irgendwas per Stringformatierung zusammenzustückeln benutzt man Listen für die Argumente.

Code: Alles auswählen

def call_nwx(programm_path, config, path):
    subprocess.run([
        os.path.join(programm_path, "FiletoolsTaskRunner.exe.lnk"),
        "/i", config,
        "/of", path
    ])
AlexE
User
Beiträge: 5
Registriert: Samstag 20. März 2021, 10:15

Donnerstag 8. April 2021, 18:28

Sorry,

ich bitte seit über einem Jahr um Unterstützung in der Automatisierung und Koordination eines Megaprojektes in 3mrd Bereich. Ich bin da blutiger Anfänger.

nw steht für Navisworks, dieses Tool kann verschiedene Exporte die nutze, daher das x.... klingt für mich logisch und ich habe es in der Zentralen config auch sehr gut dokumentiert.
Falls sich dann doch mal welche finden sollten die mitmachen und Ahnung davon haben bin ich gerne bereit eine Vernünftige Bezeichung zu vergeben.

habe es jetzt erstmal so gelöst.

Code: Alles auswählen

import subprocess


def func_nwx(str_prog,config,path):

    cmd = [
        r"C:\Program Files\Autodesk\Navisworks Manage 2021\FiletoolsTaskRunner.exe",
        "/i", config,
        "/of", path,
            ]
    subprocess.run(cmd)
PS: das call_* werde ich übernehmen, erscheint mir logisch ;)

Gruß Alex
Antworten