「subprocess.call」は機能しません。エラーメッセージ:「[WinError193]%1は有効なWin32アプリケーションではありません」[重複]

Nov 25 2020

私のスクリプトは、さまざまな種類のスクリプト(.exe、.py、.cなど)を開く必要があり、この目標を達成するには、次の2つの手順を使用します。

  1. os.chdir(FOLDER_PATH)
  2. os.system("start "+SCRIPT_NAME)

コードは機能しますos.system("start "+SCRIPT_NAME)が、使用されるたびにコンソールウィンドウが表示されます。それを隠すために、私はsubprocessモジュールを使わなければならないことをインターネットで読んだ。これらのコマンドを使用しようとしましたが、機能しません。

C:\test
λ ls -l
total 16
-rw-r--r-- 1 Admin 197121 13721 Oct 19 00:44 test.py

C:\test
λ python
Python 3.8.3 (tags/v3.8.3:6f8c832, May 13 2020, 22:20:19) [MSC v.1925 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> import subprocess
>>> from subprocess import CREATE_NO_WINDOW
>>>
>>> subprocess.call("test.py", creationflags=CREATE_NO_WINDOW)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python38-32\lib\subprocess.py", line 340, in call
    with Popen(*popenargs, **kwargs) as p:
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python38-32\lib\subprocess.py", line 854, in __init__
    self._execute_child(args, executable, preexec_fn, close_fds,
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python38-32\lib\subprocess.py", line 1307, in _execute_child
    hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
OSError: [WinError 193] %1 is not a valid Win32 application
>>>

どうすれば問題を解決できますか?

回答

Doyousketch2 Nov 26 2020 at 00:19

あなたは使用することができcall()ますが、run()新しいバージョン、およびより堅牢なことになっています。https://docs.python.org/3/library/subprocess.html 目標を達成する限り、好きなフレーバーを使用してください。

#! /usr/bin/env python3
import subprocess as sp

cmd = ['echo', 'hi']  ##  separate args in list.  safer this way
response = sp .run( cmd, stdout=sp.PIPE, stderr=sp.PIPE, encoding='utf-8', creationflags=sp.CREATE_NO_WINDOW)
print( response.stderr,  response.stdout )


cmd = 'echo hi'  ##  alternate string method
response = sp .run( cmd, stdout=sp.PIPE, stderr=sp.PIPE, shell=True, encoding='utf-8', creationflags=sp.CREATE_NO_WINDOW)
print( response.stderr,  response.stdout )

エンコーディングを指定しない場合は、b 'バイナリエンコードされた文字列'を返します。