web-dev-qa-db-fra.com

Python - comment appeler des programmes externes python?

Je préfère ceci en disant que c'est un devoir. Je ne veux pas que le code soit écrit pour moi, juste pour être dirigé dans la bonne direction.

Nous sommes en mesure de travailler sur un projet de notre choix, donc je travaille sur un programme pour être un mini portfolio de tout ce que j'ai écrit jusqu'à présent. Je vais donc créer un programme que l'utilisateur entrera le nom d'un programme (choisi dans une liste donnée) puis exécutera le programme choisi dans le Shell existant.

Cependant, je ne trouve pas vraiment d'informations sur la façon de faire appel à des programmes externes. Est-ce que quelqu'un peut-il me montrer la bonne direction? J'ai envisagé de mettre tout le code dans un long programme avec un tas de boucles if pour exécuter le bon code, mais j'aimerais en faire un BIT plus compliqué que cela.

24
Henry Edward Quinn IV

Si vous voulez appeler chacun comme un script Python, vous pouvez faire

import subprocess
subprocess.call(["python", "myscript.py"])
subprocess.call(["python", "myscript2.py"])

Mais une meilleure façon est d'appeler des fonctions que vous avez écrites dans d'autres scripts, comme ceci:

import myscript
import myscript2

myscript.function_from_script1()
myscript2.function_from_script2()

function_from_script1() etc sont définis dans les fichiers myscript.py et myscript2.py. Voir cette page sur modules pour plus d'informations.

35
David Robinson

Consultez la documentation subprocess .

5
Nick Bastin

De plus, si vous devez passer des arguments supplémentaires, procédez comme suit:

import subprocess
subprocess.call(["python", "myscript.py", "arg1", "arg2", "argN"])
2
Max

Si vous souhaitez charger un fichier externe Python et l'exécuter à l'intérieur de l'interpréteur actuel sans avoir à gérer les modules, vous pouvez utiliser le module standard importlib.util .

Ceci est utile lorsque vous devez expédier des scripts Python à des fins de démonstration, mais que vous ne voulez pas les faire partie d'un (sous-) module - tout en étant en mesure de les exécuter automatiquement, comme lors des tests d'intégration. Voici un exemple:

# A sample Python script
sh$ cat snippet/demo.py 
SOME_MODULE_GLOBAL=True
print("Hello, here is the demo snippet!")
# There is no `__init__.py in the _snippet_ directory
sh$ cat snippet/__init__.py
cat: snippet/__init__.py: No such file or directory

Maintenant en utilisant importlib.util vous pouvez charger demo.py même s'il ne fait pas partie d'un module:

>>> import importlib.util

# Bypass the standard import machinery to manually load a Python script from
# a filepath
>>> spec = importlib.util.spec_from_file_location('demo','snippet/demo.py')
>>> spec
ModuleSpec(name='demo', loader=<_frozen_importlib_external.SourceFileLoader object at 0x7fa549344eb8>, Origin='snippet/demo.py')
>>> module = importlib.util.module_from_spec(spec)
>>> module
<module 'demo' from 'snippet/demo.py'>

# The next command will run the module:
>>> spec.loader.exec_module(module)
Hello, here is the demo snippet!

# Module variables are accessible just like if it was a
# _normally_ imported module:
>>> module.SOME_MODULE_GLOBAL
True
1
Sylvain Leroux