Seite 1 von 1

subprocess.Popen( setup.py entry_point )

Verfasst: Freitag 21. August 2015, 16:58
von jens
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

Re: subprocess.Popen( setup.py entry_point )

Verfasst: Freitag 21. August 2015, 17:20
von DasIch

Code: Alles auswählen

subprocess.Popen([sys.executable, sys.modules[entry_point.__module__].__file__])

Re: subprocess.Popen( setup.py entry_point )

Verfasst: Freitag 21. August 2015, 17:31
von jens
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

Re: subprocess.Popen( setup.py entry_point )

Verfasst: Freitag 21. August 2015, 17:50
von jens
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

Re: subprocess.Popen( setup.py entry_point )

Verfasst: Freitag 21. August 2015, 19:28
von jens
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...