J'ai un programme python "Alfred.py" que je veux pouvoir exécuter en cliquant sur une icône ou en tapant "Alfred" dans le terminal. Il est connecté à un fichier de base de données et extrait les fichiers Excel lorsque cela est demandé. Lorsque j'essaye de l'exécuter en cliquant, voici ce que j'obtiens:
mcaay:~ mcaay$ Alfred -bash: Alfred: command not found
Cette ligne:
mcaay:~ mcaay$ Alfred.py Traceback (most recent call last): File "/Users/mcaay/Documents/Moje Dokumenty/MANTA/Alfred/Alfred.py", line 59, in <module> AND Usterka IS NOT NULL;""") sqlite3.OperationalError: no such table: repairs
signifie qu'Alfred.py n'a pas Je ne trouve pas le fichier .db, je l'ai créé mais il était vide donc il n'y avait pas de table appelée "réparations". Ce fichier .db se trouve dans le même répertoire que Alfred.py.
Ce que j'ai fait jusqu'à présent:
[Desktop Entry] Name=Alfred Exec=python3 /Users/mcaay/Documents/Moje\ Dokumenty/MANTA/Alfred/Alfred.py Terminal=true Type=Application
Quand je tape dans le terminal "Alfred.py", j'obtiens:
sqlite3.OperationalError: no such table: repairs
Donc la même chose qu'en cliquant sur "Alfred.desktop". Si je tape juste "Alfred", j'obtiens:
mcaay:~ mcaay$ /Users/mcaay/Documents/Moje\ Dokumenty/MANTA/Alfred/Alfred.desktop ; exit; /Users/mcaay/Documents/Moje Dokumenty/MANTA/Alfred/Alfred.desktop: line 1: [Desktop: command not found Traceback (most recent call last): File "/Users/mcaay/Documents/Moje Dokumenty/MANTA/Alfred/Alfred.py", line 59, in <module> AND Usterka IS NOT NULL;""") sqlite3.OperationalError: no such table: repairs logout Saving session... ...copying shared history... ...saving history...truncating history files... ...completed. [Process completed]
Je veux simplement taper "Alfred" pour fonctionner et je veux qu'il voit la base de données et les autres fichiers correctement, ou alternativement si cliquer sur l'icône fonctionnera correctement, cela est également acceptable. Mon Googe-Fu m'a échoué ici. Que faire?
P.S. J'ai remarqué qu'un fichier de base de données est créé dans mon répertoire personnel ("/ Users / mcaay"), comme si Alfred.py était extrait de la destination d'origine vers une destination temporaire et y était exécuté (les autres fichiers n'étaient pas extraits, le programme s'est donc planté).
3 Réponses :
Lorsque vous indiquez à SQLite où trouver la base de données, vous utilisez un chemin relatif, mais ce chemin relatif est relatif au répertoire de travail actuel . Vous devez soit changer de répertoire dans votre script, soit donner à SQLite un chemin complet vers votre base de données. Dans tous les cas, cela nécessite la logique pour trouver où se trouve votre script, ou vous pouvez placer la base de données dans un autre chemin bien connu (par exemple, ~ / .config / alfred
). Personnellement, je préfère toujours créer des chemins complets et éviter autant que possible les chemins relatifs (et l'option de changement de répertoire), mais un chdir vers votre chemin de script devrait également être relativement sûr et nécessiter moins de changements à ce stade. / p>
Ahh, cela a du sens. Je ne veux pas utiliser les chemins complets car de nombreuses personnes utiliseront ce programme et je ne veux pas leur dire où ils doivent le placer sur leur ordinateur.
Btw, votre réponse m'a aidé à trouver une solution différente, merci!
Je pense qu'il cherche simplement le fichier .db dans le répertoire dans lequel il a été exécuté. Vous devez soit définir un .db avec le chemin absolu, soit accéder au fichier .db dans le même répertoire du script que vous pouvez obtenir en utilisant:
os.path.dirname(sys.argv[0edral)
Merci, hésitait à utiliser immédiatement os.path.dirname (sys.argv [0])
, car cela rendrait le code un peu moins lisible dans une situation potentiellement évitable, et heureusement, j'ai trouvé un autre façon de le faire.
Ok, donc après une bonne nuit de sommeil, les choses que j'ai lues se sont finalement calculées dans ma tête et j'ai eu une réponse. Tout ce que j'ai fait avant est inutile et peut être jeté.
Ma solution (gardez à l'esprit que j'utilise macOS Mojave atm):
.start_alfred.sh
.
Il s'agit d'un script shell qui aura une commande appelable dans le terminal pour accéder à mon répertoire spécifié, puis exécuter un script python. mcaay:~ mcaay$ Alfred Co jest? >>> thx np mcaay:Alfred mcaay$
Le nom de cette fonction ( Alfred
) est ce qui invoquera les commandes shell incluses à l'intérieur. Il s'agit essentiellement de faire ce que vous feriez normalement dans le terminal pour démarrer un programme.
.bash_profile
, j'ai ajouté source ~ / .start_Alfred.sh
à la fin, donc à chaque fois que j'ouvre le terminal tout ce qui se trouve dans .start_Alfred .sh
devient disponible immédiatement. C'est fondamentalement ça :) Peut-être pas le plus propre mais super facile et assez bon pour ce dont j'ai besoin. Les réponses de Tanktalus et de l'asafpr m'ont aidé à trouver cette solution.
Cas d'utilisation:
#!/bin/bash function Alfred() { cd /Users/mcaay/Documents/Moje\ Dokumenty/MANTA/Alfred python3 Alfred.py }
Thx
est la commande pour terminer le script python.