Readonly Filesystem bei QPython auf Android

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
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Habe mir aufs Handy QPython installiert und wollte da eine Datei schreiben. Da sagt mir QPython, dass das ein Readonly Filesystem wäre, obwohl das nicht stimmt.

Läßt sich das ändern?
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Alfons Mittelmeyer hat geschrieben:obwohl das nicht stimmt
Und das weißt du, weil?
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

sparrow hat geschrieben:
Alfons Mittelmeyer hat geschrieben:obwohl das nicht stimmt
Und das weißt du, weil?
Natürlich, weil ich da beliebige Dateien reinschreiben kann, aber nicht mit fh=open('file.jpg','wb') von QPython aus.
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Nee, du vermutest. Wissen tust du das nicht. Und du vermutest falsch.

Das Verzeichnis ist für die App offensichtlich nicht schreibbar, sprich schreibgeschützt. Ungehinderten Zugriff auf das Deteisystem muss sich eine App unter Android bei der Installation freigeben lassen. QPython fragt aber nicht danach. Entsprechend musst du in ungeschützte Verzeichnisse schreiben - wie man es bei anderen Betriebssystemen auch tut. Es ist ja eher ungewöhnlich direkt in das Arbeitsverzeichnis zu schreiben.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Hab gemerkt, woran es lag. Man muss die Dateiangabe absolut machen. Jetzt geht es. Jetzt brauche ich nicht mehr mühsam Dateien auf das Handy übertragen. Bisher vom PC auf einen Stick kopiert und den Stick dann auf dem Router angeschlossen und vom Handy mit demm ES Dateiexplorer heruntergeholt.

Jetzt habe ich mir ein kleines Python Programm geschrieben und das einmal ausprobiert. Das ist auf meinem PC

Code: Alles auswählen

# router and client address
ROUTERHOST, ROUTERPORT = "192.168.0.103", 9999

# starting client
import client as myclient
client = myclient.Client(ROUTERHOST, ROUTERPORT)

# configure router and client
client.receive_ids(("OK",))
client.send_ids(("SENDJPG",))

fh = open("foto.jpg","rb")
myjpg = bytearray(fh.read())
fh.close()

client.send("SENDJPG",("/storage/extSdCard/Music/myfoto.jpg",myjpg))

looping = True

def do_ok(message):
    global looping
    print("OK")
    looping = False

client.do_receive("OK",do_ok)

while looping: pass

client.shutdown()
Und das ist auf dem Handy:

Code: Alles auswählen

# router and client address
ROUTERHOST, ROUTERPORT = "192.168.0.103", 9999

# starting client
import client as myclient
client = myclient.Client(ROUTERHOST, ROUTERPORT)

# configure router and client
client.send_ids(("OK",))
client.receive_ids(("SENDJPG",))


looping = True

import time

def save_in_file(message):
    global looping
    fh = open(message[0],"wb")
    fh.write(message[1])
    fh.close()
    client.send("OK")
    time.sleep(0.1)
    looping = False
    
client.do_receive("SENDJPG",save_in_file)

while looping: pass

client.shutdown()
Da habe ich meinen Messagebroker verwendet und in zwei Sekunden war ein Bild mit 5 MB auf dem Handy
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Alfons Mittelmeyer: wenn Du unbedingt Deinen Akku leersaugen willst ...

Importe sollten immer ganz oben stehen, vor jeder anderen Anweisung. Was soll die Umbenennung in myclient? Vielleicht solltest Du Deine Modulnamen gleich besser wählen? Dateien öffnet man in einem with-Statement. Warum mußt Du die Bytes händisch in ein Array umwandeln? Global sollte nicht verwendet werden. Den Event-Loop Deines Clients solltest Du explizit aufrufen. Der Busy-Loop sagt dann wohl alles.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@Sirius3 Das war nur mal zum Ausprobieren. Und ganz oben muss die IP Adresse stehen. Mit richtigem event wait überträgt das Programm eine 60 MB Datei in 40 Sekunden von meinem PC zum Handy. Eigentlich recht flott.

So ist es dann wohl besser, bis auf den client, der noch keinen richtigen Namen hat

Code: Alles auswählen

import threading
import client as myclient

# router address
ROUTERHOST, ROUTERPORT = "192.168.0.103", 9999

# starting client
client = myclient.Client(ROUTERHOST, ROUTERPORT)

# configure router and client
client.receive_ids(("OK",))
client.send_ids(("SENDJPG",))

client.send("SENDJPG",("/storage/extSdCard/tcp/music.mp3",open("music.mp3","rb").read()))

event = threading.Event()

def do_ok(message):
    print("OK")
    event.set()

client.do_receive("OK",do_ok)

event.wait()
client.shutdown()
Ach so der Name SENDJPG ist auch dumm, wenn ich da jetzt eine 60 MB Mp3 Datei an das Handy schicke.
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Nur um nochmal zum eigentlichen Threadthema zurück zu kommen:
Es liegt nicht daran einen absoluten Pfad anzugeben, sondern einen Pfad, der auch beschreibbar ist. In deinem Fall die SD-Karte.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@sparrow Das brauchst Du mir bestimmt nicht sagen, das ist mir schließlich bekannt. Nur hatte ich angenommen, wenn ich von QBython aus ein Script in einem beschreibbaren Pfad aufrufe, dass ich mich dann auch in diesem Pfad befinde. Aber das ist eben nicht so. Wie man in einen beschreibbaren Pfad kommt, und darin QPython aufrufen kann, weiss ich nicht. Daher ist die Lösung, absolute Pfadangaben zu verwenden.
BlackJack

@Alfons Mittelmeyer: Die Lösung wäre dann wohl eher den Dateinamen vom Skript zu nehmen (`__file__` ist im Modul definiert) und daraus dann den Zielpfad mit Funktionen aus `os.path` zu erstellen (`os.path.dirname()` und ggf. `os.path.join()`).
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@BlackJack Jetzt habe ich mir mal ausgeben lassen, wo ich bin, wenn ich nichts absolut angebe: im root Verzeichnis zumindest mit den os Befehlen. Klar dass man da ohne su Rechte nichts schreiben kann. Die imports allerdings wurden richtig ausgeführt. Und da ich sowieso vom PC aus auf das Handy zugreife, empfiehlt sich da eine absolute Pfadangabe. Das Script brauche ich nur für den Zugriff vom PC aus.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Absolut ist niemals gut, das ist Hardgecoded und wird irgendwann/irgendwo kaputt gehen. Nimm die Tipps einfach an.

Imports funktionieren weil PYTHONPATH wahrscheinlich richtig gesetzt ist.
the more they change the more they stay the same
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@Dav1d Und wo soll bitte das Startverzeichnis sein, zu dem ich etwas relativ angeben soll? Hier kopiere ich eine Datei auf das Handy:

Code: Alles auswählen

file_handle = open("dir_extern.py","rb")
client.send("OPEN","/storage/emulated/0/com.hipipal.qpyplus/scripts3/dir_extern.py")
Die erste Zeile ist auf dem PC. Die zweite Zeile ist der absolute Pfad für das Kopieren auf das Handy. Und um den geht es. Soll das relativ zu scripts3 sein oder relativ zu Pictures oder relativ zu Music. Soll man zum Schreiben auf ein anderes Gerät da irgendwie auf diesem ein relatives Startverzeichnis festlegen? Mein USB Stick hat auch kein relatives Startverzeichnis. Deiner wohl?
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@Alfons Mittelmeyer:
Pfadangaben, egal ob absolut oder relativ, machen nur dann hartkodiert Sinn, wenn das auf dem Zielgerät(-en) so erwartet werden kann. Falls nicht - Pfad vom Anwender erfragen.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@jerch Hartcodiert macht schon einen Sinn. Denn ich bin der Anwender. Und ich will keinen input machen, das auf einen Zettel schreiben und dann händisch eintippen.
Wenn ich mal eine grafische Benutzeroberfläche habe, und wenn das einmal eine Anwendung ist, ja dann brauche ich das nicht mehr hart zu kodieren.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@Alfons Mittelmeyer:
Dann ist die ganze Diskussion müßig. Was DU mit DEINEN Geräten/Skripten tust, ist DEIN Bier.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@jerch Natürlich ist da weitere Diskussion überflüssig. Hatte halt gedacht dass da nichts geht, weil ich gewohnt war, dass os Path gleich Python Path ist, aber os Path ist bei QPython eben die root.
Antworten