Matlab mit subprocess.call

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
GPD
User
Beiträge: 19
Registriert: Freitag 8. April 2016, 08:22

Matlab mit subprocess.call

Beitragvon GPD » Sonntag 10. April 2016, 15:19

Hallo,

ich versuche gerade über die subprocess.call Funktion Matlab zu bedienen.

Folgendes funktioniert schon:


import subprocess
retcode = subprocess.call(["matlab", "-nosplash", "-nodesktop", "-r", "pythonTest;quit;"])


Dabei wird die Matlab-Version gestartet, die im Pfad der Umgebungsvariable ganz vorn steht. Ich möchte aber selbst entscheiden, welche Matlab-Version gestartet wird. Daurum habe ich folgendes versucht:

#externesProgramm = "\"C:\Program Files (x86)/MATLAB/R2012a/bin/matlab.exe\""
externesProgramm = "\"C:\Program Files/MATLAB/R2015b/bin/matlab.exe\""

import subprocess
retcode = subprocess.call([externesProgramm, "-nosplash", "-nodesktop", "-r", "pythonTest;quit;"])



Leider erhalt eich dann folgenden Fehler:

Traceback (most recent call last):
File "C:\Users\user\Dropbox\Master-Arbeit\Python-Skripte\helloworld\src\test.py", line 13, in <module>
retcode = subprocess.call([externesProgramm, "-nosplash", "-nodesktop", "-r", "pythonTest;quit;"])
File "C:\Python34\lib\subprocess.py", line 535, in call
with Popen(*popenargs, **kwargs) as p:
File "C:\Python34\lib\subprocess.py", line 848, in __init__
restore_signals, start_new_session)
File "C:\Python34\lib\subprocess.py", line 1104, in _execute_child
startupinfo)
PermissionError: [WinError 5] Zugriff verweigert


Weiss jemand, wie ich selbst entscheiden kann, welche meiner Matlab-Installationen ich ausführe?
Zuletzt geändert von GPD am Sonntag 10. April 2016, 15:47, insgesamt 1-mal geändert.
BlackJack

Re: Matlab mit subprocess.call

Beitragvon BlackJack » Sonntag 10. April 2016, 15:34

@GPD: Da muss als erstes Argument der Name der ausführbaren Datei stehen, gegebenfalls mit Pfad. So ein Pfad darf vor dem Laufwerksbuchtaben keine Anführungszeichen haben und auch am Ende ist es sehr unwahrscheinlich das die EXE matlab.exe" statt matlab.exe heisst. Diese Anführungszeichen brauchst Du in der Shell wegen der Leerzeichen im Pfad, aber hier ist ja schon dadurch klar, dass es sich trotz Leerzeichen im Pfad um *einen* Wert handelt weil der als einzelner Wert in der Liste steht. Ist ja gerade einer der Gründe warum man `subprocess` verwendet, damit man sich nicht um das schützen von irgendwelchen Zeichen kümmern muss, die für eine Shell eine besondere Bedeutung haben.
GPD
User
Beiträge: 19
Registriert: Freitag 8. April 2016, 08:22

Re: Matlab mit subprocess.call

Beitragvon GPD » Sonntag 10. April 2016, 15:53

Hallo BlackJack,

vielen Dank erstmal für deine schnelle Antwort!

Leider tappe ich noch im Dunkeln. Wenn ich den Namen und Pfad der ausführbaren Datei ohne Anführungszeichen eintrage sieht mein Befehl so aus:

import subprocess
retcode = subprocess.call([C:\Program Files\MATLAB\R2015b\bin\matlab.exe,"-nosplash", "-nodesktop", "-r", "pythonTest;quit;"])


Dies führt aber zu folgende Fehler:

retcode = subprocess.call([C:\Program Files\MATLAB\R2015b\bin\matlab.exe,"-nosplash", "-nodesktop", "-r", "pythonTest;quit;"])
^
SyntaxError: invalid syntax


Wie meinst du das, mit den Anführungszeichen?
GPD
User
Beiträge: 19
Registriert: Freitag 8. April 2016, 08:22

Re: Matlab mit subprocess.call

Beitragvon GPD » Sonntag 10. April 2016, 15:57

Ich habe gerade folgendes ausprobiert, weil ich in den weiten des Internets sowas ähnliches schonmal gesehen hab:

import subprocess

subprocess.call([r"C:\Program Files\MATLAB\R2015b\bin\matlab.exe","-nosplash", "-nodesktop", "-r", "pythonTest;quit;"])

Durch das "r" vor dem Pfad der auszführenden Datei klappt das nun! :D

Ich habe keine Ahnung was das "r" bedeutet, werde es aber recherchieren. Wenn mir einer das hier schreibt, bin ich aber auch sehr dankbar :wink:
BlackJack

Re: Matlab mit subprocess.call

Beitragvon BlackJack » Sonntag 10. April 2016, 16:24

@GPD: Na ganz ohne Anführungszeichen geht nicht, ich meine die Anführungszeichen in der Zeichenkette, nicht die Anführungszeichen die Python benötigt, damit das überhaupt eine literale Zeichenkette für Python ist. Du bist von "\"spam\"" zu spam gegangen statt einfach nur die Anführungszeichen in dem Wert wegzulassen: "spam".

Das r verhindert das Escapesequenzen wie '\b' ausgewertet werden und das einfach nur ein Backslash gefolgt von einem kleinen b ist, statt ein Byte das dem ASCII-Steuerzeichen BEL entspricht.
GPD
User
Beiträge: 19
Registriert: Freitag 8. April 2016, 08:22

Re: Matlab mit subprocess.call

Beitragvon GPD » Sonntag 10. April 2016, 16:40

Jetzt habe ich es verstanden!

Vielen herzlichen Dank BlackJack!!!

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder