Nach vielen Recherchen im Internet, zu vielen verschiedenen Themen, war ich nicht in der Lage, die Lösung meines Problems zu finden.Python externe Projektskriptausführung
Ich entwickle ein Tool (mit grafischer Oberfläche), das die Verarbeitung von Python-Skripten aus verschiedenen Projekten ermöglicht. Um keine Abhängigkeiten zu haben, bitte ich den Benutzer, sowohl das Projektverzeichnis als auch das zu verarbeitende Skript anzusprechen.
Um dieses Werkzeug zu entwickeln, habe ich in meiner IDE ein Projekt "benchmark_tool", welches das Projekt ist, das die GUI integriert, und das Projekt "test_project", das verschiedene Testskripte gruppiert. Offensichtlich ist das endgültige Ziel das zu kompilierende Werkzeug und somit verschwindet das Projekt "benchmark_tool" aus der IDE. Hier
ist die IDE-Architektur:
benchmark_tool (python project)
__init__.py
main.py
test_project (python project)
__init__.py
module1
__init__.py
test_script.py
module2
__init__.py
imports.py
Wie es funktioniert: Die main.py soll nennen test_script.py. test_script.py ruft imports.py beim ersten Start des Skripts auf.
UPDATE
habe ich versucht, einige Änderungen in meinem Haupt-Code:
import sys
import subprocess
subprocess.check_call([sys.executable, '-m', 'test_project.module1.test_script'], cwd='D:/project/python')
I
Traceback(most recent call last):
File "C:/Python31/lib/runpy.py", line 110, in run module as main
mod_name, loader, code, fname = _get_module_detail(mod_name)
File "C:/Python31/lib/runpy.py", line 91, in get module details
code = loader.get_code(mod_name)
File "C:/Python31/lib/pkgutil.py", line 272, in get code
self.code = compile(source, self.filename, 'exec')
File "D:/project/python/test_project/module1/test_script.py", line 474
SyntaxError: invalid syntax
Traceback (most recent call last):
File "D:/other_project/benchmark_tool/main.py", line 187, in read
subprocess.check_call([sys.executable, '-m', 'module1.test_script.py'], cwd='D:/project/python/test_project')
File "C:/Python31/lib/subprocess.py", line 446, in check call
raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['C:/Python31/python.exe', '-m', 'module1.test_script.py']' returned non-zero exit status 1
Hinweis diesen Fehler habe funktioniert es mit subprocess.Popen(['python','D:/project/python/test_project/module1/test_script.py])
Was ist der Hauptunterschied zwischen beiden Methoden? Ich muss auch Argumente an test_scripts.py übergeben, welches ist das beste, um mit einem Python-Skript zu kommunizieren (Eingabe- und Ausgabedaten werden ausgetauscht)?
Dank durch Voraus
auf Ihrem Update: Verstehen Sie, dass '' module1.test_script' und module1/test_script .py' sind verschiedene Zeichenfolgen? Ändere 'PYTHONPATH' nicht. Wo siehst du, dass ich den Pythonpfad in meiner Antwort verändere? Bitte lesen Sie meine Antwort sorgfältig - fügen Sie keinen anderen Code hinzu. Zur Klarstellung aktualisieren Sie Ihre Frage und geben Sie an, ob module1 und module2 Python-Module auf oberster Ebene sind oder ob es sich um Submodule von 'test_project' handelt (d. H. Ob 'test_project' ein Python-Modul oder nur ein Verzeichnis ist). Abhängig von der Antwort verwenden Sie das entsprechende Codebeispiel aus meiner Antwort, das beide Fälle abdeckt. – jfs
Tut mir leid, ich habe 'module1.test_script' geschrieben, aber ich habe es nicht gut geschrieben (Ich kann meinen Code nicht kopieren/einfügen, ich muss es schreiben). test_project ist ein Python-Modul, nicht nur ein Verzeichnis, und module1 und module2 sind Submodule von test_script. Ich habe den Befehl 'PYTHONPATH' entfernt, aber den gleichen Fehler bekommen. –
Warum musst du es schreiben? Wenn Sie nicht wissen, wie Sie von der Befehlszeile kopieren und einfügen können, lernen Sie (es ist nützlich) - stellen Sie eine separate Frage zu Ihrer spezifischen Umgebung. Ich kann dir nicht helfen, wenn du nicht den genauen Befehl gibst. Auch hier unterscheidet sich "module1.test_script.py" von "module1.test_script". Wenn 'test_project' ein Python-Modul ist, dann benutze die zweite Variante aus meiner Antwort:' subprocess.check_call ([sys.executable, '-m', 'test_project.module1.test_script'], cwd = r'D: \ projekt \ python ') '. Nicht verwandt: Sie können Raw-String-Literale für Windows-Pfade verwenden: mit Präfix 'r''. – jfs