Pyinstaller-Ausgabe komplett an ein tkinter-Textfeld schicken

Fragen zu Tkinter.
DMD-OL
User
Beiträge: 315
Registriert: Samstag 26. Dezember 2015, 16:21

Halli hallo
Ich suche einen Weg, die Pyinstaller-Ausgabe in der Python-Console (unten links in Python; weiß leider nicht, wie das Feld korrekt genannt wird)
in einem tkinter Textfeld meiner eigenen GUI darstellen zu lassen. Hab da schon einiges gesucht/gelesen, aber bisher war nix wirklich passendes dabei.
Ich habe jetzt die Idee, ob ich nicht vielleicht direkt im Pythonmodul 'pyinstaller' (das ich ja importiert habe, um in Python damit zu arbeiten) Änderungen vornehmen kann.
Falls da was schiefgeht :), lade ich es einfach neu runter :).
Ich habe mir das pyinstaller-Modul mal angeschaut. In dem Ordner gibt es eine Datei ganz unten die heißt: log.py
Die ist denke ich verantwortlich für die pyinstaller-Ausgabe. Kann man die z.B. mit einem return-Befehl dazu bringen, mir die ganzen Ausgaben an mein Textfeld zu schicken? Oder ist das zu "heiß" dort etwas zu verändern?
Würde gern mal eure Meinung hören/lesen?
Benutzeravatar
__blackjack__
User
Beiträge: 13111
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@DMD-OL: Was ist denn „unten links in Python“? Python hat kein oben, unten, links, oder rechts, das ist ein Konsolenprogramm, keine GUI-Anwendung. Also welche Software verwendest Du da, und was machst Du damit genau?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
DMD-OL
User
Beiträge: 315
Registriert: Samstag 26. Dezember 2015, 16:21

Ach, PyCharm meinte ich.
Ich wollte doch einfach nur wissen, ob es möglich ist, die ausgabe von pyinstaller in ein tk.Text zu übertragen?
Könnte man das direkt im pyinstaller modul (das man ja runterladen kann) verändern oder ist das nicht ratsam?
Benutzeravatar
DeaD_EyE
User
Beiträge: 1021
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Du könntest von deinem Programm aus den Pyinstaller mit Popen starten und stderr/stdout der PIPE zuweisen.
Dann warten bis der Prozess beendet ist und dann stdout und stderr lesen und die Daten in eine Variable übertragen (z.B. tkinter.StringVar).

Falls die Ausgabe gestreamt werden soll, wird es etwas komplizierter.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
DMD-OL
User
Beiträge: 315
Registriert: Samstag 26. Dezember 2015, 16:21

Ich habs jetzt erstmal in einer Datei pyinstaller.py gespeichert.
Ich habe vor, daraus eine executable zu machen, die ich dann für alles verwenden kann.
Damit kann ich erst einmal aus allem eine exe machen, wenn ich die richtigen Pfade angebe.


pyinstaller.py:

Code: Alles auswählen

import os
import shutil
import winshell
import PyInstaller.__main__
from win32com.client import Dispatch


# MAIN SETTINGS
#
SOURCE_PATH = os.getcwd()
# BASE_PATH = os.environ['USERPROFILE']
TARGET_PATH = ['C:', 'Users', 'chris', 'Desktop', 'Hot Run']
#
####
GAME_NAME = TARGET_PATH[-1]
TARGET_GAME_RELEVANTS = ['images', 'sounds', GAME_NAME + '.exe', GAME_NAME + '.spec']
SOURCE_GAME_IRRELEVANTS = ['__pycache__', 'build']

TARGET, TARGET_CNT = str(), 0
for item in TARGET_PATH:
    if TARGET_CNT == 0:
        TARGET += item
        TARGET_CNT += 1
    else:
        TARGET += '\\'+item

PATH_ICON = os.path.join(TARGET, 'images', 'icon', 'minion.ico')

for item in os.listdir(SOURCE_PATH):
    source_path = os.path.join(os.getcwd(), item)
    target_path = os.path.join(TARGET, item)
    if os.path.isdir(source_path):
        if not os.path.isdir(target_path):
            shutil.copytree(source_path, target_path, symlinks=False, ignore=None)
    else:
        shutil.copy2(source_path, target_path)

PyInstaller.__main__.run([
    'main.py',
    '--onedir',
    '--onefile',
    '--windowed',
    '--noconsole',
    '--name=' + GAME_NAME,
    '--icon=' + PATH_ICON,
    '--distpath=' + TARGET,
    '--specpath=' + TARGET
])
Jetzt bin ich dabei, ein eigenes Projekt zu machen mit tkinter layout, buttons für die festlegung der pfade, usw.
Habe in diesem Projekt auch ein kleines ausgabefenster.
In dieses neue Projekt baue ich zur Zeit auch die oben stehende pyinstaller.py datei ein.
Dort würde ich nun gern eine direkte live ausgabe von pyinstaller installieren.
Ist das auch möglich?
Ich hoffe, ich habe es einigermaßen verständlich verdeutlicht bekommen :)
Sirius3
User
Beiträge: 17752
Registriert: Sonntag 21. Oktober 2012, 17:20

Deine Konstanten sind keine Konstanten. Das ist sehr verwirrend.
SOURCE_PATH wird inkonsistent verwendet, weil Du an vielen Stellen doch os.getcwd benutzt, was an sich überflüssig ist, weil relative Pfade automatisch vom Arbeitsverzeichnis ausgehen.
Das ist wirklich die komplizierteste Art und weise, wie Du aus der Liste TARGET_PATH einen TARGET-Pfad zusammenbaust. Dafür gibt es doch os.path.join.
os.path ist aber veraltet und sollte durch pathlib.Path ersetzt werden:

Code: Alles auswählen

import shutil
import PyInstaller.__main__
from pathlib import Path

# MAIN SETTINGS
SOURCE_PATH = Path.cwd()
# BASE_PATH = os.environ['USERPROFILE']
TARGET_PATH = Path('C:/Users/chris/Desktop/Hot Run')
GAME_NAME = TARGET_PATH.name
TARGET_GAME_RELEVANTS = ['images', 'sounds', GAME_NAME + '.exe', GAME_NAME + '.spec']
SOURCE_GAME_IRRELEVANTS = ['__pycache__', 'build']
PATH_ICON = TARGET_PATH / 'images' / 'icon' / 'minion.ico'

def main():
    for source_path in SOURCE_PATH.iterdir():
        if source_path.name in SOURCE_GAME_IRRELEVANTS:
            continue
        target_path = TARGET_PATH / source_path.name
        if source_path.isdir():
            if not target_path.isdir():
                shutil.copytree(source_path, target_path, symlinks=False, ignore=None)
        else:
            shutil.copy2(source_path, target_path)

    PyInstaller.__main__.run([
        'main.py',
        '--onedir',
        '--onefile',
        '--windowed',
        '--noconsole',
        f'--name={GAME_NAME}',
        f'--icon={PATH_ICON}',
        f'--distpath={TARGET_PATH}',
        f'--specpath={TARGET_PATH}',
    ])

if __name__ == "__main__":
    main()
DMD-OL
User
Beiträge: 315
Registriert: Samstag 26. Dezember 2015, 16:21

Danke an euch.
und @ DeaD_EyE: Ich werd mich jetzt erst einmal schlau machen und versuchen das hinzubekommen.
WErde mich aber wohl dann noch mal melden (müssen)... :)
DMD-OL
User
Beiträge: 315
Registriert: Samstag 26. Dezember 2015, 16:21

Habe mich jetzt mit dem Starten von Pyinstaller via subprocess beschäftigt.
Später füge ich dann noch ein tk.Text für die ausgabe von pyinstaller hinzu.
Zunächst wollte ich erst einmal pyinstaller mit subprocess laufen lassen und die ausgabe an stderr/stdout zuweisen.
Bin aber neuling, bei der benutzung von subprocess.
In meinem Code:

Code: Alles auswählen

import os
import shutil
import subprocess
import PyInstaller.__main__

SRC_FILE_PATH = "C:/Users/chris/Documents/PyCharm/Hot Run/main.py"
SRC_SPLIT_PATH = SRC_FILE_PATH.split('/')
SRC_BASE_NAME = SRC_SPLIT_PATH.pop(-1)
SRC_PATH = '/'.join(SRC_SPLIT_PATH)

TRG_FOLDER_PATH = "C:/Users/chris/Desktop/HOT RUNNER"
TRG_SPLIT_PATH = TRG_FOLDER_PATH.split('/')
TRG_BASE_NAME = TRG_SPLIT_PATH.pop(-1)
TRG_PATH = '/'.join(TRG_SPLIT_PATH)

SRC_ICN_FILE = "C:/Users/chris/Documents/PyCharm/Hot Run/images/icon/minion.ico"
SRC_IMG_FOLDER = "C:/Users/chris/Documents/PyCharm/Hot Run/images"
SRC_SND_FOLDER = "C:/Users/chris/Documents/PyCharm/Hot Run/sounds"


def copy_additives(src_path, trg_path):
    if os.path.isdir(src_path):
        if not os.path.isdir(trg_path):
            shutil.copytree(src_path, trg_path, symlinks=False, ignore=None)
    else:
        shutil.copy2(src_path, trg_path)


for item in os.listdir(SRC_PATH):
    SOURCE_PATH = os.path.join(SRC_PATH, item).replace('\\', '/')
    if SRC_IMG_FOLDER == SOURCE_PATH:
        TRG_IMG_FOLDER = os.path.join(TRG_PATH, TRG_BASE_NAME, item).replace('\\', '/')
        copy_additives(SRC_IMG_FOLDER, TRG_IMG_FOLDER)
    elif SRC_SND_FOLDER == SOURCE_PATH:
        TRG_SND_FOLDER = os.path.join(TRG_PATH, TRG_BASE_NAME, item).replace('\\', '/')
        copy_additives(SRC_SND_FOLDER, TRG_SND_FOLDER)

os.chdir(SRC_PATH)

subprocess.call(
    PyInstaller.__main__.run([
        SRC_BASE_NAME,
        '--onedir',
        '--onefile',
        '--windowed',
        '--noconsole',
        '--name=' + TRG_BASE_NAME,
        '--icon=' + SRC_ICN_FILE,
        '--distpath=' + TRG_FOLDER_PATH,
        '--specpath=' + TRG_FOLDER_PATH
    ]))
erhalte ich die Ausnahme:

Code: Alles auswählen

[...]
7607 INFO: Building EXE from EXE-00.toc completed successfully.
Traceback (most recent call last):
  File "C:\Users\chris\Documents\PyCharm\Create EXE-File\test.py", line 41, in <module>
    subprocess.call(PyInstaller.__main__.run([
  File "C:\Program Files\Python39\lib\subprocess.py", line 349, in call
    with Popen(*popenargs, **kwargs) as p:
  File "C:\Program Files\Python39\lib\subprocess.py", line 947, in __init__
    self._execute_child(args, executable, preexec_fn, close_fds,
  File "C:\Program Files\Python39\lib\subprocess.py", line 1356, in _execute_child
    args = list2cmdline(args)
  File "C:\Program Files\Python39\lib\subprocess.py", line 561, in list2cmdline
    for arg in map(os.fsdecode, seq):
TypeError: 'NoneType' object is not iterable

Process finished with exit code 1
Ich weiß nicht genau, wodurch der Fehler verursacht wird.
@ DeaD_EyE: Pyinstaller mit Popen starten und stderr/stdout der PIPE zuweisen und ja so auch noch nicht umgesetzt. :(

Ohne subprocess, sondern nur mit

Code: Alles auswählen

        PyInstaller.__main__.run([
            SRC_BASE_NAME,
            '--onedir',
            '--onefile',
            '--windowed',
            '--noconsole',
            '--name=' + TRG_BASE_NAME,
            '--icon=' + SRC_ICN_FILE,
            '--distpath=' + TRG_FOLDER_PATH,
            '--specpath=' + TRG_FOLDER_PATH
        ])
läuft der Code einwandfrei.
Sirius3
User
Beiträge: 17752
Registriert: Sonntag 21. Oktober 2012, 17:20

Konstanten werden komplett gross geschrieben, normaler Variablen dagegen komplett klein.
Das was Du da mit String-Operationen machst, macht man nicht, sondern nutzt pathlib.Path.
Aber das sag ich Dir ja jetzt schon zum Dritten mal, da scheint es eine Lernresistenz zu geben.
DMD-OL
User
Beiträge: 315
Registriert: Samstag 26. Dezember 2015, 16:21

ja. warum muß ich den pathlib.Path benutzen? was daran ist denn besser?
mir gefällt os.path sehr gut. pathlib.Path ist mir zu konfus zu benutzen, bei os.path ist die syntax sofort klar und einfacher.
hört sich ja sehr zwingend an von dir.
außerdem schreibe ich dir auch nicht zum ersten mal, daß das ein ausschnitt ist, den ich kurz vorbereite. ich möchte nicht
tagelang den mist vorbereiten, hier posten und dann keine nützliche hilfe bekommen.
Sirius3
User
Beiträge: 17752
Registriert: Sonntag 21. Oktober 2012, 17:20

Du benutzt nicht einmal os.path. uns wenn du keine nützliche Hilfe bekommst, liegt das vielleicht daran, dass sich niemand durch deinen kryptischen Code durcharbeiten will. Zudem findet du dir doch schon selbst die Antwort: subprocess.call weglassen.
DMD-OL
User
Beiträge: 315
Registriert: Samstag 26. Dezember 2015, 16:21

Wie subprocess.call weglassen?
Dann habe ich die pyinstaller-ausgabe doch wieder im pycharm-Fenster. Das möchte ich doch nicht.
Ich versuche mit subprocess eine anbindung zu pyinstaller (zum Output von pyinstaller) zu bekommen, damit ich die Ausgabe
des Pyinstaller-Moduls auslesen und in meinem eigenen fenster (tk.Text) ausgegen kann.
Im Grund das was -DeaD_EyE- schon oben beschrieben hat, versuche ich jetzt umzusetzen.
Habe im netz das hier gefunden erst mal:

Code: Alles auswählen

cmd = 'C:/Program Files/Python39/Scripts/pyinstaller.exe'.split('/')
# cmd ist der Pfad der PyInstaller.__main__-Datei (ohne split natürlich)
# args ist eine liste mit argumenten. Nur welche? args = cmd?
process = subprocess.Popen(args,
                           bufsize=0,
                           executable=True,
                           stdin=subprocess.PIPE, 
                           stdout=subprocess.PIPE, 
                           stderr=subprocess.PIPE,
                           preexec_fn=None, close_fds=False,
                           shell=True,
                           cwd=None, env=None,
                           universal_newlines=False,
                           startupinfo=None,
                           creationflags=0)
stdout, stderr = process.communicate()
und versuche nun das hier

Code: Alles auswählen

    PyInstaller.__main__.run([
        SRC_BASE_NAME,
        '--onedir',
        '--onefile',
        '--windowed',
        '--noconsole',
        '--name=' + TRG_BASE_NAME,
        '--icon=' + SRC_ICN_FILE,
        '--distpath=' + TRG_FOLDER_PATH,
        '--specpath=' + TRG_FOLDER_PATH
    ])
mit subprocess.Popen zu starten...
DMD-OL
User
Beiträge: 315
Registriert: Samstag 26. Dezember 2015, 16:21

Habe mir jetzt einige Tutorials zu subprocess.Popen angeschaut.
Weiß aber leider noch immer nicht so richtig, wie ich den Pyinstaller mit subprocess "verpacken" soll.

Code: Alles auswählen

os.chdir('C:/Users/chris/Documents/PyCharm/Hot Run')  # Diese Datei soll mit pyinstaller in eine .exe umgewandelt werden.
                                                      # Fehlerfreie funktionierendes kleines Spiel, das mit pyinstaller
                                                      # 'successful' umgewandelt wird. Nur das was pyinstaller dazu ausgibt,
                                                      # möchte ich gern in ein textfeld in tkinter schreiben lassen.
process = subprocess.Popen(['C:/Program Files/Python39/Scripts/pyinstaller.exe',
                            # SRC_BASE_NAME,
                            # '--onedir',
                            # '--onefile',
                            # '--windowed',
                            # '--noconsole',
                            # '--name=' + TRG_BASE_NAME,
                            # '--icon=' + SRC_ICN_FILE,
                            # '--distpath=' + TRG_FOLDER_PATH,
                            # '--specpath=' + TRG_FOLDER_PATH
                            ],
                           shell=True,
                           stdout=subprocess.PIPE,
                           stderr=subprocess.PIPE,
                           universal_newlines=True)

stdout, stderr = process.communicate()
print(stdout, stderr)  # Hier ist die Augabe von pyinstaller, die ich in ein tk.Text-Feld überführen möchte
process.kill()
Das gibt mir die Ausgabe:

Code: Alles auswählen

 usage: pyinstaller [-h] [-v] [-D] [-F] [--specpath DIR] [-n NAME]
                   [--add-data <SRC;DEST or SRC:DEST>]
                   [--add-binary <SRC;DEST or SRC:DEST>] [-p DIR]
                   [--hidden-import MODULENAME]
                   [--additional-hooks-dir HOOKSPATH]
                   [--runtime-hook RUNTIME_HOOKS] [--exclude-module EXCLUDES]
                   [--key KEY] [-d {all,imports,bootloader,noarchive}] [-s]
                   [--noupx] [--upx-exclude FILE] [-c] [-w]
                   [-i <FILE.ico or FILE.exe,ID or FILE.icns or "NONE">]
                   [--version-file FILE] [-m <FILE or XML>] [-r RESOURCE]
                   [--uac-admin] [--uac-uiaccess] [--win-private-assemblies]
                   [--win-no-prefer-redirects]
                   [--osx-bundle-identifier BUNDLE_IDENTIFIER]
                   [--runtime-tmpdir PATH] [--bootloader-ignore-signals]
                   [--distpath DIR] [--workpath WORKPATH] [-y]
                   [--upx-dir UPX_DIR] [-a] [--clean] [--log-level LEVEL]
                   scriptname [scriptname ...]
pyinstaller: error: the following arguments are required: scriptname


Process finished with exit code 0
Es fehlen ja jetzt noch die Argumente, die pyinstaller braucht (pyinstaller_args).
Wie übergibt man die denn jetzt an subprocess.Popen?
Benutzeravatar
__blackjack__
User
Beiträge: 13111
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@DMD-OL: `os.chdir()` hat da nichts zu suchen. Wenn der externe Prozess ein anderes Arbeitsverzeichnis als der aktuell laufende haben soll, dann hat `Popen()` ein Argument dafür.

Das ``shell=True`` macht keinen Sinn. Warum muss zwischen Deinem Prozess und dem PyInstaller noch ein zusätzlicher Shell-Prozess laufen und einfach nur die Daten durchreichen?

Für den gezeigten Aufruf braucht man nicht auf `Popen()` und `communicate()` aufteilen, das kann man auch mit `subprocess.run()` machen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
DeaD_EyE
User
Beiträge: 1021
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

DMD-OL hat geschrieben: Montag 1. Februar 2021, 00:49 ja. warum muß ich den pathlib.Path benutzen? was daran ist denn besser?
mir gefällt os.path sehr gut. pathlib.Path ist mir zu konfus zu benutzen, bei os.path ist die syntax sofort klar und einfacher.
hört sich ja sehr zwingend an von dir.
Wenn man sein Programm unter Windows, Linux und Mac ohne Anpassungen Pfade verwenden möchte, ist es mit pathlib viel einfacher.

Code: Alles auswählen

from pathlib import Path


DESKTOP = Path.home() / "Desktop"
Unter Windows ist es dann: WindowsPath('C:/Users/Andre/Desktop')
Auf meinem Linux-Server mit anderem Nutzer: PosixPath('/home/public/Desktop')
Einen Mac habe ich leider nicht zu demonstrieren.

Das geht natürlich auch mit os.path, aber es ist umständlicher.

Code: Alles auswählen

import os


DESKTOP = os.path.join(os.path.expanduser("~"), "Desktop")
Wenn man tiefer in den Quellcode von pathlib eintaucht, sieht man, dass es nicht ganz so einfach ist den Pfad des Home-Verzeichnisses in Erfahrung zu bringen.

Linux:

Code: Alles auswählen

In [18]: pathlib.PosixPath._flavour.gethomedir??
Signature: pathlib.PosixPath._flavour.gethomedir(username)
Docstring: <no docstring>
Source:
    def gethomedir(self, username):
        if not username:
            try:
                return os.environ['HOME']
            except KeyError:
                import pwd
                return pwd.getpwuid(os.getuid()).pw_dir
        else:
            import pwd
            try:
                return pwd.getpwnam(username).pw_dir
            except KeyError:
                raise RuntimeError("Can't determine home directory "
                                   "for %r" % username)
File:      ~/.pyenv/versions/3.9.1/lib/python3.9/pathlib.py
Type:      method
Windows:

Code: Alles auswählen

Signature: pathlib.WindowsPath._flavour.gethomedir(username)
Docstring: <no docstring>
Source:
    def gethomedir(self, username):
        if 'USERPROFILE' in os.environ:
            userhome = os.environ['USERPROFILE']
        elif 'HOMEPATH' in os.environ:
            try:
                drv = os.environ['HOMEDRIVE']
            except KeyError:
                drv = ''
            userhome = drv + os.environ['HOMEPATH']
        else:
            raise RuntimeError("Can't determine home directory")

        if username:
            # Try to guess user home directory.  By default all users
            # directories are located in the same place and are named by
            # corresponding usernames.  If current user home directory points
            # to nonstandard place, this guess is likely wrong.
            if os.environ['USERNAME'] != username:
                drv, root, parts = self.parse_parts((userhome,))
                if parts[-1] != os.environ['USERNAME']:
                    raise RuntimeError("Can't determine home directory "
                                       "for %r" % username)
                parts[-1] = username
                if drv or root:
                    userhome = drv + root + self.join(parts[1:])
                else:
                    userhome = self.join(parts)
        return userhome
File:      ~/.pyenv/versions/3.9.1/lib/python3.9/pathlib.py
Type:      method
Aus 10 Meter Entfernung sieht man, dass es sehr unterschiedlich ist, das Home-Verzeichnis des Nutzers zu finden.
Auch die unterschiedlichen Implementierungen sind sehr deutlich zu erkennen.


PS: Pfade als Strings mit + zu verknüpfen ist ganz falsch. Da muss man dann immer an den Pfadseparator (/ oder \) denken.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
DMD-OL
User
Beiträge: 315
Registriert: Samstag 26. Dezember 2015, 16:21

Vielen Dank.
DMD-OL
User
Beiträge: 315
Registriert: Samstag 26. Dezember 2015, 16:21

Vielen Dank.
@DMD-OL: `os.chdir()` hat da nichts zu suchen. Wenn der externe Prozess ein anderes Arbeitsverzeichnis als der aktuell laufende haben soll, dann hat `Popen()` ein Argument dafür.
@__blackjack__: os.chdir() habe ich da nicht wegen subprocess.Popen, sondern damit pyinstaller die build und dist folder im dem ordner erstellt, den ich auf den desktop kopiert habe.
sonst sind die beiden dateien im alten original ordner. ich wollte da einfach alles zusammen in einem ordner haben.

den rest versuche ich umzusetzen... danke
Benutzeravatar
__blackjack__
User
Beiträge: 13111
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@DMD-OL: Das ändert nichts daran das `os.chdir()` da nicht stehen sollte. Das ändert nicht nur das aktuelle Arbeitsverzeichnis von PyInstaller sondern auch von Deinem Programm. Wenn das externe Programm ein anderes Arbeitsverzeichnis haben soll, dann regelt man das über das entsprechende `Popen`-Argument. Dafür ist das ja da.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
DMD-OL
User
Beiträge: 315
Registriert: Samstag 26. Dezember 2015, 16:21

verstehe ich ja. für subprocess ist das vollkommen unnötig. aber für pyinstaller doch nicht. dafür hab ich das da drin.
aber ich kanns auch rausnehmen. nur das programm, in dem ich nur den pyinstaller benutze läuft wunderbar.
ich kann mir einen source file wählen (also eine py-Datei aussuchen) und einen target verzeichnis auswählen und es
wird eine executable am zielort mit icon auf dem desktop erstellt. funktioniert wunderbar. brauche aber glaub ich
einen ansatz, wie ich jetzt den pyinstaller in subprocess starten kann, damit ich die ausgabe ins text-feld überführen kann.
sonst bekomm i das wohl eher nicht hin. :(
kann mir da jmd einen ansatz zeigen?
Sirius3
User
Beiträge: 17752
Registriert: Sonntag 21. Oktober 2012, 17:20

Da Du es nicht anders verstehst.
FALSCH:

Code: Alles auswählen

os.chdir('C:/Users/chris/Documents/PyCharm/Hot Run')
process = subprocess.Popen([...],
                           shell=True,
                           stdout=subprocess.PIPE,
                           stderr=subprocess.PIPE,
                           universal_newlines=True)
Richtig:

Code: Alles auswählen

process = subprocess.Popen([...],
                           cwd='C:/Users/chris/Documents/PyCharm/Hot Run',
                           stdout=subprocess.PIPE,
                           stderr=subprocess.PIPE,
                           universal_newlines=True)
Antworten