Domanda

Ho provato a chiamare un processo tramite Python con diversi argomenti. L'esecuzione del file batch stesso funziona bene per me, ma tradurlo in Python mi fa urlare. Qui il contenuto del file batch:

"C:\Program Files\bin\cspybat" "C:\Program Files\bin\armproc.dll" "C:\Program Files\bin\armjlink.dll" "C:\Documents and Settings\USER\Desktop\CAL\testing\Verification\FRT\Code\TC1\Output\Genericb\Debug\Exe\Gen.out" --download_only --backend -B "--endian=little" "--cpu=Cortex-M3" "--fpu=None" "-p" "C:\Program Files\CONFIG\debugger\ST\iostm32f10xxb.ddf" "--drv_verify_download" "--semihosting" "--device=STM32F10xxB" "-d" "jlink" "--drv_communication=USB0" "--jlink_speed=auto" "--jlink_initial_speed=32" "--jlink_reset_strategy=0,0" 

L'eseguibile eseguito dal file batch è denominato cspybat . L'output dell'eseguibile fornisce le informazioni: Tutti i parametri dopo - backend vengono passati al back-end .

Si noti inoltre che alcuni dei parametri sono stringhe e altri no.

Soluzione

Ora funziona per me:

    """ MCU flashing function""" 
params = [r"C:\Program Files\bin\cspy",
          r"C:\Program Files\bin\arpro.dll",
          r"C:\Program Files\bin\arjink.dll",
          r"C:\Documents and Settings\USER\Desktop\Exe\GenerV530b.out",
          "--download_only", "--backend", "-B", "--endian=little", "--cpu=Cort3", "--fpu=None", "-p", 
          r"C:\Program Files\CONFIG\debugger\ST\iostm32f10xxb.ddf",
           "--drv_verify_download", "--semihosting", "--device=STM32F10xxB", "-d", "jlink", "--drv_communication=USB0",
            "--jlink_speed=auto", "--jlink_initial_speed=32", "--jlink_reset_strategy=0,0" ]
print(subprocess.list2cmdline(params))
p = subprocess.Popen(subprocess.list2cmdline(params))
È stato utile?

Soluzione

Per eseguire un file batch in Windows:

from subprocess import Popen
p = Popen("batchfile.bat", cwd=r"c:\directory\containing\batchfile")
stdout, stderr = p.communicate()

Se non vuoi eseguire il file batch, ma esegui piuttosto il comando nella tua domanda direttamente da Python, devi sperimentare un po 'con il primo argomento di Popen.

Prima di tutto, il primo argomento può essere una stringa o una sequenza.

Quindi scrivi:

p = Popen(r'"C:\Program Files\Systems\Emb Work 5.4\common\bin\run" "C:\Program Files\Systems\Emb Work 5.4\arm\bin\mpr.dll" ... ...', cwd=r"...")

o

p = Popen([r"C:\Program Files\Systems\Emb Work 5.4\common\bin\run", r"C:\Program Files\Systems\Emb Work 5.4\arm\bin\mpr.dll", ...], cwd=r"...")
# ... notice how you don't need to quote the elements containing spaces

Secondo la documentazione:

Su Windows: la classe Popen utilizza CreateProcess () per eseguire il programma figlio, che opera su stringhe. Se args è una sequenza, verrà convertito in una stringa usando il metodo list2cmdline (). Si noti che non tutte le applicazioni MS Windows interpretano la riga di comando allo stesso modo: list2cmdline () è progettato per applicazioni che utilizzano le stesse regole del runtime di MS C.

Quindi, se usi una sequenza, verrà convertita in una stringa. Probabilmente proverei prima con una sequenza, da allora non dovrai citare tutti gli elementi che contengono spazi ( list2cmdline () lo fa per te).

Per la risoluzione dei problemi, ti consiglio di passare la sequenza a subprocess.list2cmdline () e controllare l'output.

Modifica

Ecco cosa farei se fossi in te:

a) Crea un semplice script Python ( testparams.py ) in questo modo:

import subprocess
params = [r"C:\Program Files\Systems\Emb Work 5.4\common\bin\run.exe", ...]
print subprocess.list2cmdline(params)

b) Esegui lo script dalla riga di comando ( python testparams.py ), copia e incolla l'output in un'altra riga di comando, premi Invio e guarda cosa succede.

c) Se non funziona, modifica il file Python e ripeti finché non funziona.

Altri suggerimenti

Innanzitutto, non hai bisogno di tutte quelle citazioni. Quindi rimuovili. Hai solo bisogno di virgolette intorno a parametri che hanno un nome file quando quel nome ha uno spazio (stupidamente, Windows lo fa spesso).

I tuoi parametri sono semplicemente un elenco di stringhe, alcune delle quali richiedono virgolette. Poiché Windows utilizza \ non standard per un separatore di percorso, usa " raw " stringhe per questi nomi.

params = [
    r'"C:\Program Files\Systems\Emb Work 5.4\arm\bin\mpr.dll"',
    r'"C:\Program Files\Systems\Emb Work 5.4\arm\bin\ajl.dll"',
    r'"C:\Documents and Settings\USER\Desktop\abc.out"',
    "--backend",
    "-B", 
    "--endian=little",
    "--cpu=Cortex",
    "--fpu=None",
    "-p",
    r'"C:\Program Files\unknown\abc.ddf"',
    "--drv_verify_download",
    "--semihosting",
    "--device=STM32F10xxB",
    "-d",
    "jjftk",
    "--drv_communication=USB0",
    "--speed=auto",
    "--initial_speed=32",
    "--reset_strategy=0,0"]

Usa qualcosa di simile

program = r'"C:\Program Files\Systems\Emb Work 5.4\common\bin\run"'
subprocess.Popen( [program]+params )
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top