Error: unable to acces jarfile

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
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
Zuletzt geändert von GuardDog am Mittwoch 3. Mai 2017, 20:26, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@GuardDog: Entweder sind die *.jar-Dateien nicht dort wo sie sollten, oder das aktuelle Arbeitsverzeichnis stimmt nicht.
GuardDog

Leider weiß ich nicht ganz genau, was du meinst :/
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.
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
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
BlackJack

Weitere alternative: Man ermittelt den Pfad relativ zum Modul über den Wert von `__file__` in diesem Modul.
GuardDog

Sorry aber ich checke nicht was ihr von mir wollt. Bitte erklärt es so einfach wie möglich :(
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
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
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?
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`.
GuardDog

So ich habe jetzt den Fehler nicht mehr, dafür aber wieder "Unable to acess jarfile" :/
GuardDog

Also via subprocess.call bekomme ich den selben fehler
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.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@GuardDog: dann hast Du immer noch den falschen Pfad. Am besten ist es wirklich, den Pfad relativ zu __file__ zu setzen.
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)
GuardDog

Also hier ist die Lösung:

Linux mag anscheinend das Reziseable(true) nicht xD
Antworten