subprocess.Popen( setup.py entry_point )

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
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ich will DragonPy einfacher benutzbar machen. Deswegen habe ich eine "Starter GUI" gebaut.

Sieht aktuell so aus:

Bild


Hübsch ist anders, aber egal :lol:


Die GUI wird über die normal cli gestartet (wenn man keinen Parameter angibt)... setup.py hat das:

Code: Alles auswählen

setup(
    entry_points={
        "console_scripts": ["DragonPy = dragonpy.core.cli:main"],
    },
)
Wenn ich also im aktivierten virtualenv nur "DragonPy" starte, kommt diese GUI.

Das eigentliche starten einer Emulation passiert dann über subprocess.Popen()

und hier das eigentliche Problem: Wenn ich einfach subprocess.Popen(["DragonPy",...]) mache, wird die Datei "DragonPy" nicht in jedem Fall gefunden :(

Also hab ich mir gesagt, ich such einfach in sys.path nach der Datei, um den kompletten Pfad zu haben. Klappt meistens auch, aber es gibt Situationen, da klappt das nicht :(

Die automatisch generierte Datei (siehe auch [1]) sieht z.B. so aus:

Code: Alles auswählen

#!/home/jens/DragonPy_env/bin/python
# EASY-INSTALL-ENTRY-SCRIPT: 'DragonPyEmulator==0.5.2','console_scripts','DragonPy'
__requires__ = 'DragonPyEmulator==0.5.2'
import sys
from pkg_resources import load_entry_point

if __name__ == '__main__':
    sys.exit(
        load_entry_point('DragonPyEmulator==0.5.2', 'console_scripts', 'DragonPy')()
    )
Dann hab ich mal folgendes gemacht:

Code: Alles auswählen

DISTRIBUTION_NAME="DragonPyEmulator"
DIST_GROUP = "console_scripts"
ENTRY_POINT = "DragonPy"

distribution = get_distribution(DISTRIBUTION_NAME)
print(distribution)

entry_map = distribution.get_entry_map()
# Return the entry point map for `group`, or the full entry map
print("entry_map:", entry_map)

entry_info = distribution.get_entry_info(DIST_GROUP, ENTRY_POINT)
# Return the EntryPoint object for `group`+`name`, or ``None``
print("entry_info:", entry_info)

entry_point = distribution.load_entry_point(DIST_GROUP, ENTRY_POINT)
# Return the `name` entry point of `group` or raise ImportError
print("entry_point:", entry_point)
Ausgabe:

Code: Alles auswählen

DragonPyEmulator 0.5.2
entry_map: {'console_scripts': {'DragonPy': EntryPoint.parse('DragonPy = dragonpy.core.cli:main')}}
entry_info: DragonPy = dragonpy.core.cli:main
entry_point: <function main at 0xb5a9c92c>
Damit kann ich aber nicht direkt was anfangen, wenn ich subprocess.Popen() nutzten will. Das will ich, damit man mal eben mehrere Instanzen in separaten Prozessen starten will... Wobei ich dazu theoretisch auch das multiprocessing modul nutzten könne und direkt <function main at 0xb5a9c92c> nutzten... Aber ich glaube das ist zu kompliziert, oder?
Wobei es schöner wäre, wenn die Ausgaben von mehreren Instanzen nicht in der selben Console landen würde... Aber das ist mir jetzt erstmal egal...

Noch jemand eine Idee?!?

[1] https://pythonhosted.org/setuptools/set ... t-creation

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Code: Alles auswählen

subprocess.Popen([sys.executable, sys.modules[entry_point.__module__].__file__])
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Hm! Das sieht interessant aus. Danke!

EDIT: Führt aber in diesem Fall nicht zum Erfolg:

Code: Alles auswählen

/home/jens/DragonEnvPy3/lib/python3.4/site-packages/click/core.py
Weil: entry_point= <click.core.Group object at 0x7f5140053f98>

Aber das bringt mich auf eine Idee:

Code: Alles auswählen

python -m dragonpy.core.cli
:D

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Jup, das geht. Also:

Code: Alles auswählen

DISTRIBUTION_NAME="DragonPyEmulator"
DIST_GROUP = "console_scripts"
ENTRY_POINT = "DragonPy"

distribution = get_distribution(DISTRIBUTION_NAME)
entry_info = distribution.get_entry_info(DIST_GROUP, ENTRY_POINT)
module_name = entry_info.module_name

args = [sys.executable, "-m", module_name, "--version"]
print("call: ", " ".join(args))
subprocess.Popen(args).wait()
Raus kommt:

Code: Alles auswählen

call:  /home/jens/DragonEnvPy3/bin/python3 -m dragonpy.core.cli --version
cli.py, version 0.5.2

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

So, nun läuft es erstmal mit der neuen Variante: https://github.com/jedie/DragonPy/commi ... 5ea0c6bf67

Aber so richtig glücklich macht mich das nicht...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten