Modul mit Klick ausführen

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
Goswin
User
Beiträge: 366
Registriert: Freitag 8. Dezember 2006, 11:47
Wohnort: Ulm-Böfingen
Kontaktdaten:

Ich benutze Linux Mint_20.3 Una, und Python_3.8.

Mein Python-Modul erstellt eine Textdatei datB anhand einer Textdatei datA, und hat die Form

Code: Alles auswählen

#! /usr/bin/python3

#codezeilen
#codezeilen

def main():
   #codezeilen

if __name__ == '__main__': main()
und wenn ich ein Terminal öffne und an den Ort des Moduls gehe, kann ich es ohne weiteres mit ./meinModul01.py ausführen - alles richtig.

Nun möchte ich aber nicht immer ein Terminal öffnen, sondern das Modul mit einem Klick auf die Quelldatei laufen lassen, was laut Internetsuche möglich sein soll. Warum passiert bei mir garnichts (es entsteht keine Datei datB), wenn ich darauf klicke oder wenn ich per Maustaste "öffnen mit Python3" auswähle?

Noch erstaunlicher: Ich habe ein anderes Modul mit tkinter, nennen wir es meinModul02.py, welches die gleiche Form hat und mit einem einfachen Mausklick problemlos ausgeführt werden kann.
Benutzeravatar
__blackjack__
User
Beiträge: 13919
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Goswin: Ich vermute mal das *wird* ausgeführt und scheitert dann daran, dass das aktuelle Arbeitsverzeichnis ein anderes ist. Wie greifst Du denn auf `datA` zu? Einfach relativ zum Arbeitsverzeichnis oder explizit relativ zum Modul über `__file__`, oder wenigstens über einen absoluten Pfad?
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
Benutzeravatar
Goswin
User
Beiträge: 366
Registriert: Freitag 8. Dezember 2006, 11:47
Wohnort: Ulm-Böfingen
Kontaktdaten:

@blackjack:
Hier mehr Einzelheiten:

Code: Alles auswählen

#! /usr/bin/python3
##coding: UTF-8

def baue_datei(datA,datB):
   dptA = open(datA,'r')
   dptB = open(datB,'w')
   #
   alter_Inhalt = dptA.readline()[-1]
   #codezeilen
   #codezeilen
   dptB.write(f"{neuer_Inhalt}\n")
   #
   dptA.close()
   dptB.close()

def main():
   datA_str = '../ordnerA/datA'
   datB_str = 'datB'
   #
   baue_datei(datA_str,datB_str)

if __name__ == '__main__': main()
Benutzeravatar
Goswin
User
Beiträge: 366
Registriert: Freitag 8. Dezember 2006, 11:47
Wohnort: Ulm-Böfingen
Kontaktdaten:

@blackjack:
Einen Zugriff "relativ zum Modul über `__file__`" kenne ich nicht und wüsste garnicht, wie man das macht...
Benutzeravatar
Dennis89
User
Beiträge: 1503
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

Code: Alles auswählen

from pathlib import Path


def main():
    datA = Path(__file__).parents[1] / "ordnerA/datA"
    print(datA)


if __name__ == '__main__':
    main()
`pathlib` ist hier ganz nützlich:
https://docs.python.org/3/library/pathl ... th.parents

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Antworten