Il y a de nombreuses bonnes réponses ici mais vous devriez éviter à tout prix de transmettre des variables non sécurisées à un sous-processus en utilisant shell=True
car il s'agit d'un risque de sécurité. Les variables peuvent s'échapper vers le shell et exécuter des commandes arbitraires ! Si vous ne pouvez vraiment pas l'éviter, utilisez au moins shlex.quote()
de python3 pour échapper la chaîne (si vous avez plusieurs arguments séparés par un espace, mettez des guillemets autour de chaque morceau au lieu de la chaîne entière).
shell=False
est toujours la valeur par défaut lorsque vous passez un tableau d'arguments.
Maintenant les solutions sûres...
Méthode n°1
Modifiez l'environnement de votre propre processus - le nouvel environnement s'appliquera à Python lui-même et à tous les sous-processus.
os.environ['LD_LIBRARY_PATH'] = 'mon_chemin'
command = ['sqsub', '-np', var1, '/repertoire_personnel/autrerepertoire/executable']
subprocess.check_call(command)
Méthode n°2
Créez une copie de l'environnement et passez-la aux enfants. Vous avez un contrôle total sur l'environnement des enfants et cela n'affectera pas l'environnement de Python.
myenv = os.environ.copy()
myenv['LD_LIBRARY_PATH'] = 'mon_chemin'
command = ['sqsub', '-np', var1, '/repertoire_personnel/autrerepertoire/executable']
subprocess.check_call(command, env=myenv)
Méthode n°3
Uniquement sur Unix : Exécutez env
pour définir la variable d'environnement. Plus contraignant si vous avez de nombreuses variables à modifier et non portable, mais comme la #2 vous conservez un contrôle total sur l'environnement de Python et des enfants.
command = ['env', 'LD_LIBRARY_PATH=mon_chemin', 'sqsub', '-np', var1, '/repertoire_personnel/autrerepertoire/executable']
subprocess.check_call(command)
Évidemment, si var1
contient plusieurs arguments séparés par des espaces, ils seront maintenant transmis en tant qu'un seul argument avec des espaces. Pour conserver le comportement d'origine avec shell=True
, vous devez composer un tableau de commandes contenant la chaîne divisée :
command = ['sqsub', '-np'] + var1.split() + ['/repertoire_personnel/autrerepertoire/executable']