Import wird ohne auffordung ausgeführt

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
Leon33
User
Beiträge: 7
Registriert: Samstag 15. Oktober 2022, 13:50

Servus,

Wie in meinem Ersten Beitrag hier im Forum bereits erwähnt bin ich noch relativ neu im Umgang mit Python.

Ich versuche aktuell mir ein Programm zu basteln das meinen Rechner beim Herunterfahren automatisch mit meiner NAS synchronisiert. Dieses Programm habe ich in mehrere Dateien unterteilt die ich am Ende über eine Main-Datei zum jeweils nötigen Zeitpunkt ausführen möchte.
Nun habe ich allerdings das Problem das in einem meiner Unterscripte(im Folgenden Script 1) mein anderes Unterscript(Script 2) ausgeführt wird. Obwohl ich es nur per import-Befehl importiere.

Das ist Script 1, hier wird das importierte Script 2 (im Code "aktStatus") beim Import ausgeführt.

Code: Alles auswählen

import os
from pathlib import Path 
import aktStatus
import sync  

def lastStatus():
    homedirectory = str(Path.home())
    status = homedirectory
    print(homedirectory)
    """readStatus = (open(status,"r"))
    loadStatus = readStatus.read()
    if loadStatus and aktStatus == "ohhdhh":
        sync.startsync()"""
Das ist Script 2 welches in Script 1 ausgeführt wird.

Code: Alles auswählen

import os

def checknasconnect():
    ping_nas = os.system("ping -n 0 -w 5 NAS >nul")
    if ping_nas == 1:
        aktStatus = "online"
    else:
        aktStatus = "offline"
    print(aktStatus)
Das komische daran ist für mich einfach, das bei meinem dritten Script ("import sync" im ersten Code) das ähnlich aufgebaut ist wie script 2 der Code beim importieren nicht ausgeführt wird.
Ich verstehe nicht wirklich warum bei meinem Sync-Script der Code nicht ausgeführt wird.
Das ist Script 3:

Code: Alles auswählen

import os
import shutil
from pathlib import Path

def startsync():
    os.system(r"net use h: \\NAS\home")
    shutil.copy()
    print("Test")
Ich hoffe ihr könnt mir helfen ich verstehe es einfach nicht.
Zuletzt geändert von Leon33 am Montag 17. Oktober 2022, 14:32, insgesamt 2-mal geändert.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte statt Bildern (die nicht funktioniert haben) den Code posten. Kann man besser lesen und verstehen. WENN man sie denn in die dafuer notwendigen Code-Tags setzt.
Leon33
User
Beiträge: 7
Registriert: Samstag 15. Oktober 2022, 13:50

Habs geändert
Sirius3
User
Beiträge: 18278
Registriert: Sonntag 21. Oktober 2012, 17:20

Das sind sicher nicht Deine kompletten Skripte. Denn alle Deine Skripte definieren nur eine Funktion und machen sonst nichts.
Beim importieren wird alles ausgeführt, was auf oberster Ebene steht; wenn da andere Dinge als Funktionsdefinitionen stehen, werden die natürlich auch ausgeführt.
Deshalb dürfen auf oberster Ebene nur Definitionen stehen. Eine Ausnahme ist:

Code: Alles auswählen

if __name__ == "__main__":
    main()
Dieser if-Zweig wird beim importieren nicht betreten, weil beim Import __name__ den Namen des Moduls enthält, und beim Ausführen als Skript den fixen Wert "__main__".
Benutzeravatar
__blackjack__
User
Beiträge: 14076
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Leon33: Das mach nicht so wirklich Sinn lauter Module mit nur einer Funktion drin zu schreiben. Wenn das importiert wird, dann ist das auch kein Skript/Programm sondern ein Modul und man fürht Module nicht zu bestimmten Zeitpunkten aus, sondern man importiert die und ruft dann Funktionen daraus auf.

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase).

Namen sollten keine kryptischen Abkürzungen enthalten. Zwischenworteinnamengehörenunterstriche. Sonst ist das schlecht zu lesen.

Zeichenketten, auch Mehrzeilige, sind keine Kommentare und nicht zum auskommentieren von Code gedacht. Das Kommentarzeichen in Python ist ``#``, damit kommentiert man dann auch Code aus, wenn das denn unbedingt notwendig ist.

`os.system()` sollte man nicht verwenden, sondern das `subprocess`-Modul, und die Funktionalität dort ohne ``shell=True``, denn dann handelt man sich die gleichen Probleme ein weswegen man `os.system()` nicht verwenden sollte. Zum Beispiel, dass man gar nicht weiss von wo der Rückgabecode kommt — von der Shell oder dem Programm das man in der Shell gestartet hat.

Ein `Path`-Objekt in eine Zeichenkette wandeln, die dann einfach so noch mal an einen anderen Namen binden, um den dann als Argument für `open()` zu benutzen ist eine ziemlich sinnlose Odyssee. `Path`-Objekte haben nicht nur eine `open()`-Methode, sondern sogar eine Methode um den kompletten Inhalt einer Datei zu lesen, inklusive öffnen und *schliessen* der Datei, was in dem gezeigten Code fehlt. Wenn man die Datei öffnet, egal ob nun mit der `open()`-Funktion oder der `open()`-Methode auf dem `Path`-Objekt sollte man das zusammen mit der ``with``-Anweisung tun, um das schliessen beim verlassen des ``with``-Blocks, aus welchem Grund auch immer, sicherzustellen.

Beim öffnen von Textdateien sollte man immer die Kodierung der Datei angeben.

`aktStatus` im ersten Skript wird niemals den Wert einer Zeichenkette haben — es macht keinen Sinn ein Modul mit einer Zeichenkette zu vergleichen. Damit wird die ``if``-Bedingung dort niemals wahr. Und ich bin mir nicht so ganz sicher ob Du ``and`` verstanden hast. Der erste Teil der Bedingung ist `loadStatus` und ist wahr wenn in der Datei mindestens ein Zeichen steht. Egal welches. So ist der Wahrheistwert von Zeichenketten definiert: leere Zeichenkette ist ”unwahr”, alle anderen sind ”wahr”. Das gilt generell für Sequenzdatentypen und auch generell für Containertypen.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Leon33
User
Beiträge: 7
Registriert: Samstag 15. Oktober 2022, 13:50

__blackjack__ hat geschrieben: Montag 17. Oktober 2022, 19:32 @Leon33: Das mach nicht so wirklich Sinn lauter Module mit nur einer Funktion drin zu schreiben. Wenn das importiert wird, dann ist das auch kein Skript/Programm sondern ein Modul und man fürht Module nicht zu bestimmten Zeitpunkten aus, sondern man importiert die und ruft dann Funktionen daraus auf.

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase).

Namen sollten keine kryptischen Abkürzungen enthalten. Zwischenworteinnamengehörenunterstriche. Sonst ist das schlecht zu lesen.

Zeichenketten, auch Mehrzeilige, sind keine Kommentare und nicht zum auskommentieren von Code gedacht. Das Kommentarzeichen in Python ist ``#``, damit kommentiert man dann auch Code aus, wenn das denn unbedingt notwendig ist.

`os.system()` sollte man nicht verwenden, sondern das `subprocess`-Modul, und die Funktionalität dort ohne ``shell=True``, denn dann handelt man sich die gleichen Probleme ein weswegen man `os.system()` nicht verwenden sollte. Zum Beispiel, dass man gar nicht weiss von wo der Rückgabecode kommt — von der Shell oder dem Programm das man in der Shell gestartet hat.

Ein `Path`-Objekt in eine Zeichenkette wandeln, die dann einfach so noch mal an einen anderen Namen binden, um den dann als Argument für `open()` zu benutzen ist eine ziemlich sinnlose Odyssee. `Path`-Objekte haben nicht nur eine `open()`-Methode, sondern sogar eine Methode um den kompletten Inhalt einer Datei zu lesen, inklusive öffnen und *schliessen* der Datei, was in dem gezeigten Code fehlt. Wenn man die Datei öffnet, egal ob nun mit der `open()`-Funktion oder der `open()`-Methode auf dem `Path`-Objekt sollte man das zusammen mit der ``with``-Anweisung tun, um das schliessen beim verlassen des ``with``-Blocks, aus welchem Grund auch immer, sicherzustellen.

Beim öffnen von Textdateien sollte man immer die Kodierung der Datei angeben.

`aktStatus` im ersten Skript wird niemals den Wert einer Zeichenkette haben — es macht keinen Sinn ein Modul mit einer Zeichenkette zu vergleichen. Damit wird die ``if``-Bedingung dort niemals wahr. Und ich bin mir nicht so ganz sicher ob Du ``and`` verstanden hast. Der erste Teil der Bedingung ist `loadStatus` und ist wahr wenn in der Datei mindestens ein Zeichen steht. Egal welches. So ist der Wahrheistwert von Zeichenketten definiert: leere Zeichenkette ist ”unwahr”, alle anderen sind ”wahr”. Das gilt generell für Sequenzdatentypen und auch generell für Containertypen.
Okay, mir bringen die Sachen die du geschrieben hast leider nicht sehr viel. Ich habe keine Ahnung von diesem Subprocess Ding. Das was ich mir eben durchgelesen (subprocess.call, os.popen) hat leider nicht geklappt. Wäre cool wenn du meine Codes bearbeiten und hier reinstellen könntest.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte nicht den gesamten Post davor nochmal zitieren. Der steht da doch schon.

Und wenn etwas nicht geklappt hat, dann bitte deine Versuche zeigen (am besten in Gaenze), und mit der relevanten Fehlermeldung oder zumindest Fehlerbeschreibung. Programmierservice fuer fertige Loesungen ist hier eher selten.
Benutzeravatar
__blackjack__
User
Beiträge: 14076
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Leon33: Warum bringen Dir die Informationen nichts? Was sind die Probleme bei `subprocess`? Falls Du keine Ahnung davon hast: das ist dokumentiert. Es setzt Python-Grundlagen voraus, also unter anderem das wissen darum, das jeder Wert einen Datentyp hat, dieser Datentyp bestimmt welche Operationen mit dem Wert durchgeführt werden können, und was es bei den Grunddatentypen so für Operationen gibt. Und wie literale Werte von diesen Typen syntaktisch aussehen. In Batch-Skripten gibt es letztlich nur Zeichenketten — das ist in den allermeisten Programmiersprachen nicht so.

Was Du relativ problemlos machen könntest wäre das mit den verschiedenen Modulen sein zu lassen und erst einmal *eine* Datei für das Programm zu verwenden. Damit erledigt sich dann auch direkt die Frage zu der Du das Thema eröffnet hast.

Die zweite Anmerkung war die formale Namensschreibweise und die Abkürzungen in Namen. Es sollte kein grosses Problem sein, das zu ändern.

Aus einer mehrzeiligen Zeichenkette, die zum auskommentieren von Code missbraucht wurde, einen echten Kommentar zu machen, sollte auch kein Problem sein. Ist eventuell ein Punkt an dem man einmal ein bisschen recherchieren muss, wie man das mit maximal zwei Tastenkombinationen macht wenn die Zeilen markiert sind. Sollte der verwendete Editor das nicht können, und auch nicht so konfiguriert werden können, dann würde ich mich dringend nach einem geeigneten Editor umsehen. Das ist eine Zeitinvestition, die man nur einmal machen sollte, denn so etwas wie auskommentieren sollte mit einer Tastenkombination machbar sein, sonst taugt der Editor nicht zum programmieren und es kostet jedes mal unnötig Zeit wenn man mal was aus- oder einkommentieren muss.

Das mit dem `Path`-Objekt — da muss man sich halt die Dokumentation von `pathlib` anschauen.

Bei der Kodierungsangabe beim öffnen von Textdateien: Ist dir klar was Kodierungen sind? Falls nicht: das muss man als Programmierer heute wissen. Die Zeiten das jeder ASCII verwendet, oder cp850 weil alle in Mitteleuropa leben und DOS benutzen, waren ja schon vorbei als alle in Mitteleuropa lebten und von DOS auf Windows umgestiegen sind, und feststellten das jetzt alle cp1251 benutzen. Bis dann das Internet kam und sich irgendwie nicht nur über USA und Mitteleuropa erstreckte. 🙂

Und der letzte Absatz hat wieder mit Datentypen zu tun. Man kann Werte mit unterschiedlichen Datentypen meistens nicht sinnvoll vergleichen. Module mit Zeichenketten zu vergleichen macht beispielsweise überhaupt keinen Sinn. Das ist immer ungleich, egal welches Modul, und egal was in der Zeichenkette als Text drin steht.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten