Seite 1 von 1

Error: unable to acces jarfile

Verfasst: Mittwoch 3. Mai 2017, 20:15
von GuardDog
Hi leute,

ich habe unter Ubuntu 17.04 den Error, dass wenn ich folgendes Script ausühre, ich den oben beschriebenen Fehler erhalte:
[codebox=python file=Unbenannt.txt]from Tkinter import *
import os

def breakout():
os.system("java -jar data/src/breakout.jar")
def pong():
os.system("java -jar data/src/pong.jar")
def snake():
os.system("java -jar data/src/snake.jar")
def list():
breakout_btn_img.grid_forget()
pong_btn_img.grid_forget()
snake_btn_img.grid_forget()
list_btn.grid_forget()
image_btn.grid(row=0, column=0)
breakout_btn.grid(row=1, column=0)
pong_btn.grid(row=2, column=0)
snake_btn.grid(row=3, column=0)
def image():
breakout_btn.grid_forget()
pong_btn.grid_forget()
snake_btn.grid_forget()
image_btn.grid_forget()
list_btn.grid(row=0, column=0)
breakout_btn_img.grid(row=1, column=0)
pong_btn_img.grid(row=2, column=0)
snake_btn_img.grid(row=3, column=0)


root = Tk()
root.title("TheArcadeMachine")
root.resizable(False, False)

list_btn = Button(root, width=47, command=list, relief=SOLID, borderwidth=1, text="list mode")
breakout_img = PhotoImage(file="data/img/breakout.gif")
breakout_btn_img = Button(root, width=333, height=127, image=breakout_img, command=breakout, relief=FLAT)
breakout.image = breakout_img
pong_img = PhotoImage(file="data/img/pong.gif")
pong_btn_img = Button(root, width=333, height=127, image=pong_img, command=pong, relief=FLAT)
pong.image = pong_img
snake_img = PhotoImage(file="data/img/snake.gif")
snake_btn_img = Button(root, width=333, height=127, image=snake_img, command=snake, relief=FLAT)
snake.image = snake_img
image_btn = Button(root, width=47, command=image, relief=SOLID, borderwidth=1, text="picture mode")
breakout_btn = Button(root, width=47, command=breakout, relief=FLAT, text="Breakout", anchor=W, justify=LEFT)
pong_btn = Button(root, width=47, command=pong, relief=FLAT, text="Pong", anchor=W, justify=LEFT)
snake_btn = Button(root, width=47, command=snake, relief=FLAT, text="Snake", anchor=W, justify=LEFT)



list_btn.grid(row=0, column=0)
breakout_btn_img.grid(row=1, column=0)
pong_btn_img.grid(row=2, column=0)
snake_btn_img.grid(row=3, column=0)
root.mainloop()[/code]

ich habe bereits einen "executable Bit" gesetzt

Re: Error: unable to acces jarfile

Verfasst: Mittwoch 3. Mai 2017, 20:37
von BlackJack
@GuardDog: Entweder sind die *.jar-Dateien nicht dort wo sie sollten, oder das aktuelle Arbeitsverzeichnis stimmt nicht.

Re: Error: unable to acces jarfile

Verfasst: Mittwoch 3. Mai 2017, 21:02
von GuardDog
Leider weiß ich nicht ganz genau, was du meinst :/

Re: Error: unable to acces jarfile

Verfasst: Mittwoch 3. Mai 2017, 21:10
von BlackJack
@GuardDog: Das Programm muss von dem Verzeichnis aus gestartet werden in dem das `data/`-Verzeichnis liegt. Und das muss da halt auch liegen, mit dem Unterverzeichnis `src/` in dem dann die Jar-Dateien liegen müssen.

`src/` ist an der Stelle übrigens der falsche Name würde ich sagen. Jar-Dateien sind kein Quelltext.

Re: Error: unable to acces jarfile

Verfasst: Donnerstag 4. Mai 2017, 06:30
von GuardDog
Okay also mein Verzeichnisbaum ist jetzt:

Projekt > data > src> Die jarfiles und die main.py

unter windows funktioniert es mit (batch) "py data/src/main.py"

der gleiche code geht in einer bash datei nicht

Re: Error: unable to acces jarfile

Verfasst: Donnerstag 4. Mai 2017, 06:58
von noisefloor
Hallo,

du gibt's ja relative Pfad an, d.h. der Python Interpreter sucht die Pfade relative von dem Verzeichnis aus, wo er gestartet wurde. Also musst du entweder den Interpreter so aufrufen, dass die relativen Pfade auch stimmen oder du gibst absolute Pfade an.

Statt des veralteten `os.system()` möchtest auch vielleicht auch lieber den empfohlenen Weg via `subprocess`gehen. Wobei das eine stilistische / programmiertechnische Sache ist und dein eigentliches Problem nicht löst.

Gruß, noisefloor

Re: Error: unable to acces jarfile

Verfasst: Donnerstag 4. Mai 2017, 09:34
von BlackJack
Weitere alternative: Man ermittelt den Pfad relativ zum Modul über den Wert von `__file__` in diesem Modul.

Re: Error: unable to acces jarfile

Verfasst: Donnerstag 4. Mai 2017, 13:12
von GuardDog
Sorry aber ich checke nicht was ihr von mir wollt. Bitte erklärt es so einfach wie möglich :(

Re: Error: unable to acces jarfile

Verfasst: Donnerstag 4. Mai 2017, 13:57
von noisefloor
Hallo,

ok...

Sagen wir mal, die rufst unter Ubuntu / Linux den Python Interpreter auf, wenn du im Verzeichnis `/home/GuardDog` bist. Dann ist das das Verzeichnis, was die "Startebene" für relative Verzeichnisangaben ist. Der Befehl `os.system("java -jar data/src/breakout.jar")`würde also nach der Datei `breakout.jar` im Verzeichnis `/home/GuardDog/data/src/`suchen. Liegt die da nicht, bekommt du den Fehler.

Wenn du den Befehl so schreibst: `os.system("java -jar /home/GuardDog/data/src/breakout.jar")`, dann hast du eine absolute Pfadangabe und die Datei wird quasi immer gefunden, egal, von wo du den Python-Interpreter aufrufst. Absolute Pfade erkennst du unter Linux am führenden Slash /.

BTW: AFAIK ist das mit den absoluten und relativen Pfaden unter Windows genau so...

Das mit dem `__file__` kann dir dann BlackJack erklären ;-)

Gruß, noisefloor

Re: Error: unable to acces jarfile

Verfasst: Donnerstag 4. Mai 2017, 15:36
von GuardDog
Okay vielen Dank erstmal :) sorry, das es so umständlich war :D

EDIT:
Jetzt kommt folgender Fehler:

Code: Alles auswählen

Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1545, in __call__
    return self.func(*args)
  File "data/src/main_linux.py", line 6, in pong
    os.system("java -jar /Schreibtisch/TheArcadeMachine/data/src/pong.jar")
NameError: global name 'os' is not defined

Re: Error: unable to acces jarfile

Verfasst: Donnerstag 4. Mai 2017, 16:41
von GuardDog
BlackJack hat geschrieben:Weitere alternative: Man ermittelt den Pfad relativ zum Modul über den Wert von `__file__` in diesem Modul.
Was macht das jetzt genau/ bzw. wie funktioniert das?

Re: Error: unable to acces jarfile

Verfasst: Donnerstag 4. Mai 2017, 17:06
von BlackJack
@GuardDog: Wenn `os` nicht definiert ist, dann wurde es nicht importiert.

Unter dem Namen `__file__` bekommst man den Dateinamen zum Modul mit dem Pfad. Wenn man den Dateinamen davon trennt, hat man also den Pfad zum Verzeichnis in dem das Modul liegt. Und von da aus kann man dann andere Pfade zu Dateien anhängen. Um auf Pfaden zu operieren, also trennen, zusammenfügen, und mehr, gibt es viele Funktionen in `os.path`.

Re: Error: unable to acces jarfile

Verfasst: Donnerstag 4. Mai 2017, 17:31
von GuardDog
So ich habe jetzt den Fehler nicht mehr, dafür aber wieder "Unable to acess jarfile" :/

Re: Error: unable to acces jarfile

Verfasst: Donnerstag 4. Mai 2017, 18:40
von GuardDog
Also via subprocess.call bekomme ich den selben fehler

Re: Error: unable to acces jarfile

Verfasst: Donnerstag 4. Mai 2017, 18:44
von BlackJack
@GuardDog: Das löst ja auch nicht *diesen* Fehler, sondern die ganzen anderen Probleme die `os.system()` so mit sich bringt.

Edit: Und es macht es ein bisschen einfacher den korrekt berechneten Pfad zu übergeben. Oder zusätzlich einen passenden Wert für das `cwd`-Argument zu übergeben, so das der relative Pfad stimmt.

Re: Error: unable to acces jarfile

Verfasst: Donnerstag 4. Mai 2017, 18:46
von Sirius3
@GuardDog: dann hast Du immer noch den falschen Pfad. Am besten ist es wirklich, den Pfad relativ zu __file__ zu setzen.

Re: Error: unable to acces jarfile

Verfasst: Donnerstag 4. Mai 2017, 18:58
von GuardDog
So!!!!

ich habe nun einfach den Ordner verschoben und schon gings! ABER! wenn ich jetzt meine .jar dateien auf dem Pi3 starte sind diese lediglich GRAU :( (Unter Windoof nicht)

Re: Error: unable to acces jarfile

Verfasst: Freitag 5. Mai 2017, 17:06
von GuardDog
Also hier ist die Lösung:

Linux mag anscheinend das Reziseable(true) nicht xD