1
votes

Comment exécuter un script python en tant qu'exécutable et garder l'accès aux fichiers qui l'entourent?

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:

  • a ajouté "#! / usr / bin / env python3" comme 1ère ligne d'Alfred.py
  • tapé "chmod + x / Users / mcaay / Documents / Moje \ Dokumenty / MANTA / Alfred / Alfred.py" dans le terminal pour le rendre exécutable
  • a ajouté "export PATH = $ PATH: / Users / mcaay / Documents / Moje \ Dokumenty / MANTA / Alfred /" à mon .bash_profile pour rendre Alfred.py disponible à partir de n'importe quel endroit du terminal
  • a créé le fichier Alfred.desktop pour une icône cliquable:
[Desktop Entry]
Name=Alfred
Exec=python3 /Users/mcaay/Documents/Moje\ Dokumenty/MANTA/Alfred/Alfred.py
Terminal=true
Type=Application
  • a rendu Alfred.desktop exécutable en tapant "chmod + x / Users / mcaay / Documents / Moje \ Dokumenty / MANTA / Alfred / Alfred.desktop" dans le terminal

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é).


0 commentaires

3 Réponses :


0
votes

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>


2 commentaires

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!



0
votes

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)


1 commentaires

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.



0
votes

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):

  1. Dans le répertoire personnel, j'ai créé un fichier appelé .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.
  2. À l'intérieur, j'ai écrit ceci:
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.

  1. Dans mon .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.


0 commentaires