2017-08-15 1 views
1

Je crée une interface graphique qui doit être exécutée sur différents ordinateurs. Dans le script j'ai besoin d'ouvrir un programme externe et exécuter une macro à travers ce programme. J'utilise un sous-processus pour le faire. Le problème est que sans coder en dur le chemin je ne suis pas capable de trouver le programme. Je ne peux pas coder en dur le chemin, car le programme peut se trouver dans des répertoires différents sur des ordinateurs différents. Est-ce possible?Démarrer un programme externe sans coder en dur le chemin

code:

from subprocess import * 

def call_dos(self, program, *args): 

    proc = call([program, args]) 
    if proc: 
     logging.warning('Calling failed') 
    else: 
     logging.info('Calling successful') 

def partone(self, *args): 
    try: 
     self.call_dos("Myprogram.exe", r"C:\Mymacro.mko") 
    finally: 
     self.partone() 

Le message d'erreur:

Traceback: 
    'Calling failed' 

Merci pour toute réponse!

+0

l'exigence: '" Myprogram.exe "' doit être dans le chemin du système. Ceci n'est pas lié à une question python. –

Répondre

1

Vous devez vérifier que Myprogram.exe est appelable, c'est-à-dire dans le chemin du système.

Pour Windows, définissez-le dans un environnement utilisateur ou système en ajoutant le répertoire réel où se trouve l'exe à la variable d'environnement PATH.

Pour vous assurer que les utilisateurs ne blâme pas votre programme pour leur mauvaise installation, vous pouvez ajouter un contrôle si l'erreur est lisible par l'homme:

import distutils.spawn 
if not distutils.spawn.find_executable("Myprogram.exe"): 
    raise Exception("{} is not in the path, add it to path and retry".format("Myprogram.exe")) 

Vous pouvez également distribuer le programme aux côtés de votre script (même répertoire), donc vous êtes sûr qu'il est trouvé (si n'a pas besoin d'une installation profonde). Dans ce cas, faites:

self.call_dos(os.path.join(os.path.dirname(__file__),"Myprogram.exe"), r"C:\Mymacro.mko")