Seite 1 von 1
Readonly Filesystem bei QPython auf Android
Verfasst: Donnerstag 17. September 2015, 18:47
von Alfons Mittelmeyer
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?
Re: Readonly Filesystem bei QPython auf Android
Verfasst: Donnerstag 17. September 2015, 19:15
von sparrow
Alfons Mittelmeyer hat geschrieben:obwohl das nicht stimmt
Und das weißt du, weil?
Re: Readonly Filesystem bei QPython auf Android
Verfasst: Donnerstag 17. September 2015, 19:19
von Alfons Mittelmeyer
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.
Re: Readonly Filesystem bei QPython auf Android
Verfasst: Donnerstag 17. September 2015, 19:28
von sparrow
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.
Re: Readonly Filesystem bei QPython auf Android
Verfasst: Donnerstag 17. September 2015, 19:45
von Alfons Mittelmeyer
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
Re: Readonly Filesystem bei QPython auf Android
Verfasst: Donnerstag 17. September 2015, 20:09
von Sirius3
@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.
Re: Readonly Filesystem bei QPython auf Android
Verfasst: Donnerstag 17. September 2015, 21:04
von Alfons Mittelmeyer
@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.
Re: Readonly Filesystem bei QPython auf Android
Verfasst: Donnerstag 17. September 2015, 21:47
von sparrow
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.
Re: Readonly Filesystem bei QPython auf Android
Verfasst: Donnerstag 17. September 2015, 23:14
von Alfons Mittelmeyer
@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.
Re: Readonly Filesystem bei QPython auf Android
Verfasst: Freitag 18. September 2015, 11:46
von 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()`).
Re: Readonly Filesystem bei QPython auf Android
Verfasst: Freitag 18. September 2015, 17:43
von Alfons Mittelmeyer
@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.
Re: Readonly Filesystem bei QPython auf Android
Verfasst: Freitag 18. September 2015, 17:58
von Dav1d
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.
Re: Readonly Filesystem bei QPython auf Android
Verfasst: Freitag 18. September 2015, 19:31
von Alfons Mittelmeyer
@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?
Re: Readonly Filesystem bei QPython auf Android
Verfasst: Freitag 18. September 2015, 20:14
von jerch
@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.
Re: Readonly Filesystem bei QPython auf Android
Verfasst: Freitag 18. September 2015, 20:45
von Alfons Mittelmeyer
@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.
Re: Readonly Filesystem bei QPython auf Android
Verfasst: Freitag 18. September 2015, 22:22
von jerch
@Alfons Mittelmeyer:
Dann ist die ganze Diskussion müßig. Was DU mit DEINEN Geräten/Skripten tust, ist DEIN Bier.
Re: Readonly Filesystem bei QPython auf Android
Verfasst: Sonntag 20. September 2015, 00:19
von Alfons Mittelmeyer
@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.