Write funktioniert nicht.

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.
LotharK
User
Beiträge: 51
Registriert: Sonntag 22. März 2015, 10:02

Hallo,

ich beschäftige mich seit kurzem mit Python.
Schon bei den 1. kleinen Aufgaben scheitere ich. Folgender Code will einfach nicht funktionieren.

A=open("/mnt/netz/Python/Test1.txt", "w")
A.write("Test")
A.close()

Die Datei Test1.txt wird in dem angegebenen Verzeichnis zwar erstellt, aber das Wort "Test" steht nicht drin.
Wenn ich mit nano /mnt/netz/Python/Test1.txt die Datei öffne und etwas hinein schreibe, funktioniert es.
An den Rechten sollte es also nicht liegen.

Wenn ich das Programm erneut starte, wird die Datei ordnungsgemäß neu angelegt und ist wieder leer.
Ich habe schon echt lange gegoogelt, finde aber den Fehler nicht. Das Problem ist so tivial, dass ich es mir fast nicht getraue zu posten. Macht mich also bitte nicht gleich fertig. :-)
Eine Datei von dem Ort einlesen, funktioniert einwandfrei.
Übrigens - Das Schreiben funktioniert auch nicht, wenn ich andere Ordner angebe, als das Netzlaufwerk. Stets der gleiche Effekt


MfG LotharK
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Am Code liegts nicht. Lösch mal die Textdatei und teste, ob die wirklich von deinem Programm erzeugt wird. Wie sehen eigentlich die Rechte aus?
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@LotharK: Bekommst Du irgendwelche Fehlermeldungen? Wie startest Du Dein Skript? Benutzt Du eine IDE?
LotharK
User
Beiträge: 51
Registriert: Sonntag 22. März 2015, 10:02

Wie schon beschrieben, die Datei wird neu erstellt. (Ich hatte das oben schon genau beschrieben)
Ich verwende Python2 der IDE. (IDLE)
Es funktioniert der Write-Befehl nicht.
Wenn ich Append verwende, wird die bestehende Datei nicht überscgrieben un Daten, welche ich mit nano hinzufüge, bleiben erhalten.
Mit freundlichen Grüßen.
LotharK
User
Beiträge: 51
Registriert: Sonntag 22. März 2015, 10:02

Nachtrag: ich bin als root angemeldet.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@LotharK: wenn die open-Funktion abgearbeitet wird, und write fehlschlägt, dann muß es eine Fehlermeldung geben. Was passiert, wenn Du das Skript ohne IDLE startest?
PS: root ist nicht gut.
LotharK
User
Beiträge: 51
Registriert: Sonntag 22. März 2015, 10:02

Hallo Sirius3,

wenn ich das Programm ohne IDE laufen lasse, kommt kein Fehler. Das verrückte ist, die Datei wird erstellt und es befindet sich Text darin. In der IDE will es einfach nicht funktionieren. Auch nach einem Reboot nicht. Das ist wirklich fatal. Muss ich auf die IDE verzichten?
Der Code ist soooo simpel. Was, wenn es komplizierter wird? Verwendet ihr die IDE auch nicht?
Hat die IDE vielleicht andere Rechte? Kann ich mir diese vielleicht anzeigen lassen?
Unter pi und nano kann ich ganz normal Dateien erstellen und darin schreiben. Auch auf dem Netzlaufwerk, welches ein Verzeichnis auf meinem Notebook ist.

MfG LotharK
BlackJack

@LotharK: Bei dem Quelltext kann das eigentlich nicht an der IDE liegen. Ist das wirklich exakt *der* Quelltext? Du hast nicht zufällig beim `close()` die Klammern, also den eigentlichen Aufruf vergessen? Dann wird der Text nämlich nicht unbedingt in die Datei rausgeschrieben solange das Dateiobjekt noch existiert, und einige IDEs führen Module die man in der IDE ausführt in einem speziellen Namensraum aus der solange existiert wie die IDE offen ist. IDLE ist so ein Kandidat. Damit existiert das Dateiobjekt dann auch so lange wie es über diesen Namensraum erreichbar ist.
LotharK
User
Beiträge: 51
Registriert: Sonntag 22. März 2015, 10:02

Hallo BlackJack,

vielen Dank für deine Lösung. Natürlich hattest Du Recht! Ich habe tatsächlich in meinem Quelltext die Klammer vergessen. Ich glaube, da wäre ich nicht drauf gekommen, da dieser Text außerhalb der IDE ja funktionierte. Hm, dummer weise habe ich hier den exakten Code, ohne den Fehler, gepostet.
Ich danke allen, die sich meiner Sache angenommen haben und bitte um Entschuldigung für so viel Dummheit.
Jetzt schreibt es mir die Daten schön auf meinen Windows-Server.

Jetzt muss ich nur noch den Zugriff auf MS SQL Server 2008 schaffen. Na ja, da werde ich mir wohl ein Buch kaufen müssen.

Ciao LotharK
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@LotharK: ein guter Texteditor und ein Terminalfenster und eventuell ipython sind zum Programmieren effektiver und nebenwirkungsfreier als IDLE.
Ich wüßte kein Buch das die Kombination Python, Linux, MSSQL ausführlich beschreibt. Das Internet behauptet, dass Du freetds, unixodbc und pyodbc brauchst.
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Ohne die Klammern sollte der fehlerhafte Code überall nicht funktionieren.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
BlackJack

@darktrym: Naja im vorliegenden Fall wird die Datei freundlicherweise vom Betriebssystem geschlossen wenn der Prozess endet, und damit auch Daten die noch gepuffert sind, vorher rausgeschrieben. Unsauber/Fehlerhaft ist das Programm dadruch natürlich immer noch, weil man sich nicht auf so etwas verlassen sollte.
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Das Verhalten ist aber schon sehr eigen, muss wohl im Python Interpreter begründet liegen, das Puffer nicht verworfen werden.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
LotharK
User
Beiträge: 51
Registriert: Sonntag 22. März 2015, 10:02

Hallo Sirius3,

ich habe mit Python erst vor paar Stunden angefangen. Ich habe nur IDLE gefunden und wäre über jeden Tipp dankbar. Wenn ich da an andere Programmiersprachen denke, VBx, .NET, Assembler mit dem AVR-Studio. Das sind alles TOP Umgebungen. Bei Python stehen mir (noch) die Haare zu Berge. Ich will in unserer Fa. ein Zutrittssystem schaffen. Also Transponder ans Gerät, Erkennung erlaubt/nicht erlaubt also Tür auf. Die Transpondernummern sollen auf dem SQL-Server gespeichert werden. Die Personalabteilung vergibt dort die Rechte für die Transponder der Mitarbeiter. Hierbei handelt se sich maximal um 12 Türen.
Da ich schon befürchtet habe, dass das mit MS-SQL ein Problem wird, verbinden sich die Raspis erst mal mit dem MS-SQL Server2008 R2. Der Datenaustausch erfolgt dabei eben über die Dateien. Auf dem Server läuft dabei ein Dienst, der die Daten der Dateien und der SQL-Datenbank aktuell hält. Soweit funktioniert alles - und ich stolpere über die simple Klammer. Na ja, die gibt es in meinen anderen Programmiersprachen nicht (Ausrede 8) ).
Was nehmt ihr zum Programmieren der RaspBerrys? Zur Zeit quäle ich mich mit TightVNC und Putty.

Gruß LotharK

PS - ich werde gleich mal nach ipython schauen...
BlackJack

@darktrym: Das hat doch überhaupt nichts mit Python zu tun. Das ist kein Puffer von Python sondern einer vom Betriebssystem. Ein C-Programm würde genau das gleiche verhalten liefern. Das Betriebssystem räumt am Prozessende offene Dateien vom Prozess ab, also schliesst noch offene Dateien und beim schliessen ist auch bei den Systemaufrufen der meisten Betriebssysteme ein ”flush” implizit.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@LotharK: Bei Python gibt es keine komplizierten Build-Link-Deploy-Prozesse, weil ein Skript einfach gestartet wird und es läuft. Daher entfällt der offensichtlichste Grund einer Integrierten Entwicklungsumgebung. Wer mit einem riesigen Monster arbeiten will, dem wird oft PyCharm empfohlen.
Ein von microsoftlastigen Organisationen, die schonmal was von offenen Platformen gehört haben, oft begangener Weg ist es, auf dem Server ein in .NET geschriebener XMLRPC-Server, der einen Dienst zur Authentifizierung anbietet und mit der Datenbank redet. Aber auf jeden Fall lohnt es sich, .NET JsonRPC beizubringen, aber für beides gibt es auf Python-Seite passende Bibliotheken. Über Dateien zu gehen, ist umständlich, langsam, unflexibel und fehleranfällig.
Da in Python Fehler erst zur Laufzeit auffallen, die bei anderen Programmiersprachen schon beim Compilieren Fehler produzieren, ist es um so wichtiger, schon früh Tests für alle Funktionen zu schreiben. Da gibt's dann keine Ausreden dafür.
LotharK
User
Beiträge: 51
Registriert: Sonntag 22. März 2015, 10:02

Hallo Sirius3,

danke erst mal für Deine Ausführungen.

Na ja, in einer Programmierumgebung würde mir schon gefallen, wenn ich F5 drücke, wird das Programm gestartet. Python fragt jedes Mal, nach dem Speichern. Schon das allein nervt. Da ich nur so ein klitzekleines Projekt bewerkstelligen will, werde ich da nicht lange rum experimentieren, sondern mit der IDE arbeiten.

Im Grunde hast Du mit der Störanfälligkeit Recht. In meinem Falle ist's Bockwurst. Wenn Die Personalabteilung eine Änderung der Transponder / User-Daten vornimmt, wird einfach die komplette Datei neu ausgegeben. Personalnummer/Transpondernummer. Der Raspi schaut alle paar Minuten, ob es eine Datei neueren Datums gibt. Ist das der Fall, liest er die Datei ein. Die paar Leute sind in ein paar Sekunden in ein Dictionary eingelesen. Es handelt sich nur um 1260 DS. Ich hab es gerade getestet. Geht echt fix.
Sollte aus irgend einem Grund die Datei mal nicht zu lesen sein, na ja, da liest er sie eben in paar Minuten noch mal.
Klar ist das nur ne "Krücke" aber sollte erst mal funktionieren.
Ich will den Entwicklern von Python jetzt nicht zu nahe treten, aber als ich 87 mit Programmieren anfing, da war die Entwicklungsumgebung von Basic sogar besser als Python. Vielleicht mache ich ja auch nur was falsch. Sogar Assembler-Programme lassen sich mit AVR Studio besser testen. Und das ist wirklich hardwarenah.
Auf alle Fälle werde ich mir mal paar gute Bücher zulegen. Bis jetzt habe ich nur "Einstieg in RaspBerry Pi" von Daniel Kampert und dort tummeln sich ein paar echt böse Fehler.

Ciao LotharK
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

LotharK hat geschrieben: Ich will den Entwicklern von Python jetzt nicht zu nahe treten, aber als ich 87 mit Programmieren anfing, da war die Entwicklungsumgebung von Basic sogar besser als Python.
Du darfst nicht Sprache und Tooling drum herum vermischen! Insbesondere in Bezug auf IDEs. Ich habe anno '90 mit Basic auf dem C64 angefangen und würde nicht sagen, dass die Umgebung dort besser und komfortabler war, als eine stink normale Python-Shell!

Ich persönlich würde IDLE sofort aus dem Standard Python-Paket entfernen und maximal getrennt angeben. Eigentlich würde ich das das sogar komplett entfernen - oder man müsste es neu machen. Denn so wird es als eine Art IDE wahrgenommen, was IDLE aber nach heutigen Maßstäben nicht erfüllen kann.

Nimm doch einfach einen guten Editor und installiere Dir ipython. Mehr braucht es imho nicht.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
LotharK
User
Beiträge: 51
Registriert: Sonntag 22. März 2015, 10:02

Hi,
C64 - das waren noch Zeiten. Datasette, mein Gott.
iPython. Ich habe schon versucht, Informationen zu bekommen. Habe aber noch nicht das richtige Tutorial in deutsch gefunden.
Hast du da vielleicht einen Tipp?
Am liebsten wäre mir, wenn ich nicht auf dem Raspi programmieren müsste. Das kleine Fenster nervt ganz schön. Hab zuhause nur den Läppi.

Ciao LotharK
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Na, ipython ist ja nur eine etwas aufgemotzte Python Shell. Ich vermute mal, dass es da nicht unbedingt eine Dokumentation auf Deutsch gibt. Du musst Dich mit dem Gedanken anfreunden, dass Du vieles auf Englisch lesen musst, wenn Du Dich mit Python dauerhaft befassen willst.

Und in einer Shell programmiert man ja nichts größeres, sondern probiert nur kleine Dinge aus. Wenn Du dabei Raspi spezifische Dinge nutzt, wird das wohl auch nur auf einem System funktionieren, auf dem diese Libs zur Verfügung stehen...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten