Windowsコマンドシェルから実行可能コマンドとして直接実行しようとすると、Pythonプログラムに渡されるコマンドライン引数を取得できません。たとえば、このプログラム(test.py ):
import sys
print "Args: %r" % sys.argv[1:]
そして実行:
>test foo
Args: []
と比較して:
>python test.py foo
Args: ['foo']
私の構成は次のとおりです。
PATH=...;C:\python25;...
PATHEXT=...;.PY;....
>assoc .py
.py=Python.File
>ftype | grep Python
Python.CompiledFile="C:\Python25\python.exe" "%1" %*
Python.File="C:\Python25\python.exe" "%1" %*
Python.NoConFile="C:\Python25\pythonw.exe" "%1" %*
私はこれを解決したと思います。何らかの理由で、レジストリに2番目の場所があります(HKEY_CLASSES_ROOT\Python.File\Shell\open\commandに保存されているファイルの関連付けによって示される場所以外)。
[HKEY_CLASSES_ROOT\Applications\python.exe\Shell\open\command]
@="\"C:\\Python25\\python.exe\" \"%1\" %*"
これが私のシステムの制御設定のようです。上記のレジストリ設定は、「%*」を追加して、すべての引数をpython.exeに渡します(何らかの理由でレジストリにありませんでした)。
私の設定は、さらに別のレジストリキーHKEY_CLASSES_ROOT\py_auto_file
。上記の他のキーも存在しましたが、Windowsは何らかの理由でこれを使用していました。
Python 3.3の場合、私の設定は別のレジストリキーの下にありました;引数を渡すために変更したキーは
HKEY_USERS\S-1-5-21-3922133726-554333396-2662258059-1000_Classes\py_auto_file\Shell\open\command
"C:\Python\Python33\python.exe" "%1"
でした。 %*
のみを追加しました。キーの値は"C:\Python\Python33\python.exe" "%1" %*
になりました。
値が"C:\Python\Python33\python.exe" "%1"
である他のキー(少なくとも5つ)がいくつかありましたが、これが機能するように変更したキーです。
私のために機能させるには、レジストリパスを使用する必要がありました。
HKEY_CLASSES_ROOT\py_auto_file\Shell\open\command
%*
を追加しました
Python 3.6、2.7、およびAnaconda3で修正する.regファイルは次のとおりです。
python-3.6.0.reg
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\.py]
@="Python.File"
"Content Type"="text/plain"
[HKEY_CLASSES_ROOT\.pyc]
@="Python.CompiledFile"
"Content Type"="text/plain"
[HKEY_CLASSES_ROOT\.pyw]
@="Python.NoConFile"
"Content Type"="text/plain"
[HKEY_CLASSES_ROOT\py_auto_file]
[HKEY_CLASSES_ROOT\py_auto_file\DefaultIcon]
@="C:\\Python36\\DLLs\\py.ico"
[HKEY_CLASSES_ROOT\py_auto_file\Shell\open\command]
@="\"C:\\Python36\\python.exe\" \"%1\" %*"
[HKEY_CLASSES_ROOT\Python.File]
@="Python File"
[HKEY_CLASSES_ROOT\Python.File\DefaultIcon]
@="C:\\Python36\\DLLs\\py.ico"
[HKEY_CLASSES_ROOT\Python.File\Shell\open\command]
@="\"C:\\Python36\\python.exe\" \"%1\" %*"
[HKEY_CLASSES_ROOT\Python.CompiledFile]
@="Compiled Python File"
[HKEY_CLASSES_ROOT\Python.CompiledFile\DefaultIcon]
@="C:\\Python36\\DLLs\\pyc.ico"
[HKEY_CLASSES_ROOT\Python.CompiledFile\Shell\open\command]
@="\"C:\\Python36\\python.exe\" \"%1\" %*"
[HKEY_CLASSES_ROOT\Python.NoConFile]
@="Python File (no console)"
[HKEY_CLASSES_ROOT\Python.NoConFile\DefaultIcon]
@="C:\\Python36\\DLLs\\py.ico"
[HKEY_CLASSES_ROOT\Python.NoConFile\Shell\open\command]
@="\"C:\\Python36\\python.exe\" \"%1\" %*"
python-2.7.0.reg
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\.py]
@="Python.File"
"Content Type"="text/plain"
[HKEY_CLASSES_ROOT\.pyc]
@="Python.CompiledFile"
"Content Type"="text/plain"
[HKEY_CLASSES_ROOT\.pyw]
@="Python.NoConFile"
"Content Type"="text/plain"
[HKEY_CLASSES_ROOT\py_auto_file]
[HKEY_CLASSES_ROOT\py_auto_file\DefaultIcon]
@="C:\\Python27\\DLLs\\py.ico"
[HKEY_CLASSES_ROOT\py_auto_file\Shell\open\command]
@="\"C:\\Python27\\python.exe\" \"%1\" %*"
[HKEY_CLASSES_ROOT\Python.File]
@="Python File"
[HKEY_CLASSES_ROOT\Python.File\DefaultIcon]
@="C:\\Python27\\DLLs\\py.ico"
[HKEY_CLASSES_ROOT\Python.File\Shell\open\command]
@="\"C:\\Python27\\python.exe\" \"%1\" %*"
[HKEY_CLASSES_ROOT\Python.CompiledFile]
@="Compiled Python File"
[HKEY_CLASSES_ROOT\Python.CompiledFile\DefaultIcon]
@="C:\\Python27\\DLLs\\pyc.ico"
[HKEY_CLASSES_ROOT\Python.CompiledFile\Shell\open\command]
@="\"C:\\Python27\\python.exe\" \"%1\" %*"
[HKEY_CLASSES_ROOT\Python.NoConFile]
@="Python File (no console)"
[HKEY_CLASSES_ROOT\Python.NoConFile\DefaultIcon]
@="C:\\Python27\\DLLs\\py.ico"
[HKEY_CLASSES_ROOT\Python.NoConFile\Shell\open\command]
@="\"C:\\Python27\\python.exe\" \"%1\" %*"
ananconda3.reg(ユーザー名の変更)
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\.py]
@="Python.File"
"Content Type"="text/plain"
[HKEY_CLASSES_ROOT\.pyc]
@="Python.CompiledFile"
"Content Type"="text/plain"
[HKEY_CLASSES_ROOT\.pyw]
@="Python.NoConFile"
"Content Type"="text/plain"
[HKEY_CLASSES_ROOT\py_auto_file]
[HKEY_CLASSES_ROOT\py_auto_file\DefaultIcon]
@="C:\\Users\\username\\Anaconda3\\DLLs\\py.ico"
[HKEY_CLASSES_ROOT\py_auto_file\Shell\open\command]
@="\"C:\\Users\\username\\Anaconda3\\python.exe\" \"%1\" %*"
[HKEY_CLASSES_ROOT\Python.File]
@="Python File"
[HKEY_CLASSES_ROOT\Python.File\DefaultIcon]
@="C:\\Users\\username\\Anaconda3\\DLLs\\py.ico"
[HKEY_CLASSES_ROOT\Python.File\Shell\open\command]
@="\"C:\\Users\\username\\Anaconda3\\python.exe\" \"%1\" %*"
[HKEY_CLASSES_ROOT\Python.CompiledFile]
@="Compiled Python File"
[HKEY_CLASSES_ROOT\Python.CompiledFile\DefaultIcon]
@="C:\\Users\\username\\Anaconda3\\DLLs\\pyc.ico"
[HKEY_CLASSES_ROOT\Python.CompiledFile\Shell\open\command]
@="\"C:\\Users\\username\\Anaconda3\\python.exe\" \"%1\" %*"
[HKEY_CLASSES_ROOT\Python.NoConFile]
@="Python File (no console)"
[HKEY_CLASSES_ROOT\Python.NoConFile\DefaultIcon]
@="C:\\Users\\username\\Anaconda3\\DLLs\\py.ico"
[HKEY_CLASSES_ROOT\Python.NoConFile\Shell\open\command]
@="\"C:\\Users\\username\\Anaconda3\\python.exe\" \"%1\" %*"
面白い。ここでpython 2.6およびWindows XP(5.1.2600):
C:\Documents and Settings\hbrown>python test.py foo
['test.py', 'foo']
C:\Documents and Settings\hbrown>test.py foo
['C:\\Documents and Settings\\hbrown\\test.py', 'foo']
C:\Documents and Settings\hbrown>test foo
['C:\\Documents and Settings\\hbrown\\test.py', 'foo']
C:\Documents and Settings\hbrown>type test.py
import sys
print sys.argv
C:\Documents and Settings\hbrown>echo %PATHEXT%
.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.PY
C:\Documents and Settings\hbrown>assoc .py
.py=Python.File
.py
ファイルのプログラムの関連付けが台無しになる可能性があります。 .py
ファイルをpython実行可能ファイルに再度関連付けるだけです。
.py
ファイルを右クリック> Open with
> Choose default program ...
> [C:\ PythonXY\python.exeを検索]
Windowsレジストリを調べることで、Python36\pythonw.exe "%1" %*
などが表示される場所をすべて見つけました。
コマンドプロンプトでpython app.py args
と入力すると、すべてが正常に機能します。
アプリ名(app.py args
)のみを使用すると、WindowsはPythonでapp.pyを開きますが、len(argv)が1であるため、アプリがargv [1]にアクセスしようとすると失敗します。
どうやら、WindowsはpyファイルをPythonに渡すのに十分なことを知っていますが、コマンドをどのように構築するかをレジストリエントリで確認することはできません。 "%1"
ではなく"%1" %*
を使用しているようです。
すべてのレジストリキーをpython.exe
およびpy_auto_file
でチェックし、現在のpython引数を渡す最後に%*
を含むインストールを指すようにしました。かなりでした:
HKEY_CLASSES_ROOT\Applications\python.exe\Shell\open\command:
- org: "C:\ miniconda3\python.exe" "%1" "%*"
- 変更: "C:\ Python35\python.exe" "%1" "%*"
HKEY_CLASSES_ROOT\py_auto_file\Shell\open\command
- org: "C:\ Program Files\Sublime Text 3\sublime_text.exe" "%1"
- 変更: "C:\ Python35\python.exe" "%1" "%*"
HKEY_CURRENT_USER\Software\Classes\py_auto_file\Shell\open\command
- org: "C:\ Python35\python.exe" "%1" "%*"
HKEY_USERS\S-1-5-21-2621213409-1291422344-4183577876-2165\Software\Classes\py_auto_file\Shell\open\command
- org: "C:\ Python35\python.exe" "%1" "%*"
HKEY_USERS\S-1-5-21-2621213409-1291422344-4183577876-2165_Classes\py_auto_file\Shell\open\command
- org: "C:\ Python35\python.exe" "%1" "%*"
HKEY_CLASSES_ROOT\Applications\pythonw.exe\Shell\open\command
- 組織: "C:\ Python34\pythonw.exe" "%1"
- 変更: "C:\ Python35\pythonw.exe" "%1" "%*"
HKEY_CURRENT_USER\Software\Classes\Applications\python.exe\Shell\open\command
- org: "C:\ Python35\python.exe" "%1" "%*"
しかし、それは私のために仕事をしませんでした。デフォルトのpythonアプリケーションも変更する必要がありました。
ご覧のように、3つのPythonバージョンがインストールされています。どのバージョンがここにあるかを確認することは不可能なので、3つすべてをデフォルトのpython application 。最終的に、これら3つのいずれかでスクリプトの引数を取得することができました。
Windows 10システムで次のレジストリキーを編集してこれを修正した場合:
Computer\HKEY_CLASSES_ROOT\py_auto_file\Shell\open\command
Computer\HKEY_CLASSES_ROOT\Python.File\Shell\Open\Command
Computer\HKEY_CLASSES_ROOT\Applications\python.exe\Shell\open\command
この値に:
"C:\Python27\python.exe" "%1" %*