Sous-processus multiplateforme avec fenêtre cachée
-
06-07-2019 - |
Question
Je souhaite ouvrir un processus en arrière-plan et interagir avec celui-ci, mais ce processus doit être invisible sous Linux et Windows. Sous Windows, vous devez utiliser STARTUPINFO, alors que cela n’est pas valable sous Linux:
ValueError: startupinfo n'est pris en charge que sur les plates-formes Windows
Existe-t-il un moyen plus simple que de créer une commande Popen distincte pour chaque système d'exploitation?
if os.name == 'nt':
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
proc = subprocess.Popen(command, startupinfo=startupinfo)
if os.name == 'posix':
proc = subprocess.Popen(command)
La solution
Vous pouvez réduire une ligne:)
startupinfo = None
if os.name == 'nt':
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
proc = subprocess.Popen(command, startupinfo=startupinfo)
Autres conseils
Remarque: pour Python 2.7 , je dois utiliser sous-processus._subprocess.STARTF_USESHOWWINDOW
au lieu de sous-processus.STARTF_USESHOWWINDOW
.
Je ne suis pas sûr que vous puissiez être beaucoup plus simple que ce que vous avez fait. Vous parlez d'optimiser peut-être 5 lignes de code. Pour l'argent, je voudrais simplement poursuivre mon projet et l'accepter comme une conséquence du développement multiplate-forme. Si vous le faites souvent, créez une classe ou une fonction spécialisée pour encapsuler la logique et l'importer.
Vous pouvez transformer votre code en:
params = dict()
if os.name == 'nt':
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
params['startupinfo'] = startupinfo
proc = subprocess.Popen(command, **params)
mais ce n'est pas beaucoup mieux.