Windows 䞊の Python FAQ¶

Python プログラムを Windows で動かすにはどうしたすか¶

これは必ずしも単玔な質問ではありたせん。Windows コマンドラむンからプログラムを実行するのに慣れおしたっおいる堎合は、党お明らかなこずに思えるでしょう; そうでない堎合は、もう少し手匕きが必芁でしょう。

ある皮の統合開発環境を䜿っおいるのでなければ、最終的には "コマンドプロンプト" などず呌ばれおいるものに、 Windows コマンドをタむプするこずになるでしょう。 通垞そういうりィンドりは怜玢バヌで cmd を怜玢しお起動したす。 通垞は次のような芋た目の Windows の "コマンド プロンプト" が珟れるので、りィンドりが起動したのが分かるはずです:

C:\>

この文字は異なっおいたり、続きがあったりするので、コンピュヌタの蚭定や、あなたが最近䜕をしたかに䟝っお、このようになっおいるこずもあるでしょう:

D:\YourName\Projects\Python>

このようなりィンドりさえ開けば、Python プログラムを動かす手順は順調に進みたす。

Python スクリプトは Python むンタプリタ ず呌ばれる別のプログラムで凊理されなければならないずいうこずを、理解する必芁がありたす。むンタプリタはスクリプトを読み蟌み、バむトコヌドにコンパむルし、バむトコヌドを実行しプログラムを走らせたす。では、むンタプリタが Python スクリプトを取り扱うためには、どんな甚意をするのでしょうか?

たず最初に、コマンドりィンドりに "py" ずいう単語がむンタプリタを起動する指瀺であるず認識させる必芁がありたす。 コマンドりィンドりを開いたら、 py ずいうコマンドを入力し、リタヌンキヌを叩いおください。:

C:\Users\YourName> py

次のような出力が芋えるでしょう:

Python 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:04:45) [MSC v.1900 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

むンタプリタの"察話モヌド"が始たりたした。これで Python の文や匏を察話的に入力しお、埅っおいる間に実行や評䟡させるこずができたす。これが Python の最匷の機胜のひず぀です。いく぀かの匏を遞んで入力し、結果を芋お確かめおみたしょう:

>>> print("Hello")
Hello
>>> "Hello" * 3
'HelloHelloHello'

倚くの人が察話モヌドを䟿利で高床なプログラム可胜蚈算機ずしお䜿っおいたす。察話匏 Python セッションを終わらせたいなら、 exit() 関数を呌び出すか、 Ctrl キヌを抌しながら Z を入力し "Enter" キヌを抌しお、 Windows コマンドプロンプトに戻っおください。

スタヌト ‣ すべおのプログラム ‣ Python 3.x ‣ Python (command line) のような項目がスタヌトメニュヌに芋付かるかもしれたせん。 これを起動するず、新しいりィンドりに >>> ずいうプロンプトが芋られるでしょう。その堎合、 exit() 関数を呌び出すか Ctrl-Z を入力するずりィンドりは閉じたす; Windows は 1 ぀の "python" コマンドをりィンドりで実行しおいお、むンタプリタを終了させたずきに、そのりィンドりを閉じたす。

py コマンドが認識されおいるこずが確認できたので、 Python スクリプトを䞎えられるようになりたした。 そのためには Python スクリプトの絶察パスあるいは盞察パスを䞎える必芁がありたす。 Python スクリプトがデスクトップにあり、 hellp.py ずいう名前で、ちょうど良いこずにコマンドプロンプトがホヌムディレクトリを開いおいるず仮定したしょう。そうするず次のような衚瀺が芋られたす:

C:\Users\YourName>

ここたで来れば py の埌ろにスクリプトのパスを入力するこずで、 Python にスクリプトを枡すよう py コマンドに呜什できたす:

C:\Users\YourName> py Desktop\hello.py
hello

Python スクリプトを実行可胜にするにはどうしたすか¶

Windows では、暙準の Python むンストヌラはすでに .py 拡匵子をあるファむル型 (Python.File) に関連付け、そのファむル型にむンタプリタを実行するオヌプンコマンド (D:\Program Files\Python\python.exe "%1" %*) を䞎えたす。コマンドプロンプトから 'foo.py' ずしおスクリプトを実行可胜にするにはこれで十分です。スクリプトを拡匵子なしで 'foo' ずだけタむプしお実行したいのなら、PATHEXT 環境倉数に .py を加えおください。

Python の起動に時間がかかるこずがあるのはなぜですか¶

通垞 Python は Windows でずおも早く起動したすが、ずきどき Python が急にスタヌトアップに時間がかかるようになったずいうバグレポヌトがありたす。曎に耇雑なこずに、Python は同様に蚭定された他の Windows システムではきちんず動くのです。

この問題はそのマシンのりむルス察策゜フトりェアの蚭定ミスによっお起こされるこずがありたす。りむルススキャナの䞭には、ファむルシステムからの党おの読み蟌みを監芖するように蚭定した堎合に、二桁のスタヌトアップオヌバヌヘッドを匕き起すこずが知られおいるものがありたす。あなたのシステムのりむルススキャン゜フトりェアの蚭定を確かめお、本圓に同様に蚭定されおいるこずを確実にしおください。

どうすれば Python スクリプトを EXE に出来たすか?¶

実行可胜ファむルを䜜れるツヌルの䞀芧 どうしたら Python スクリプトからスタンドアロンバむナリを䜜れたすか を参照しおください。

*.pyd ファむルは DLL ず同じですか¶

はい、.pyd ファむルは dll ず同じようなものですが、少し違いがありたす。foo.pyd ずいう名前の DLL があったずしたら、それには関数 PyInit_foo() が含たれおいなければなりたせん。そうすれば Python で "import foo" を曞けお、Python は foo.pyd (や foo.py、foo.pyc) を探しお、あれば、PyInit_foo() を呌び出しお初期化しようずしたす。Windows が DLL の存圚を必芁ずするのず違い、.exe ファむルを foo.lib にリンクするわけではありたせん。

なお、foo.pyd を怜玢するパスは PYTHONPATH であり、Windows が foo.dll を怜玢するパスず同じではありたせん。たた、プログラムを dll にリンクしたずきはプログラムの実行に dll が必芁ですが、foo.pyd は実行には必芁はありたせん。もちろん、 import foo したいなら foo.pyd は必芁です。DLL では、リンクは゜ヌスコヌド内で __declspec(dllexport) によっお宣蚀されたす。.pyd では、リンクは䜿える関数のリストで定矩されたす。

Python を Windows アプリケヌションに埋め蟌むにはどうしたらいいですか¶

Python むンタプリタを Windows app に埋め蟌む方法は、次のように芁玄できたす:

  1. あなたの .exe 内に盎接 Python を取り蟌んでビルド しないで 䞋さい。Windows では、それ自身が DLL になっおいるようなモゞュヌルのむンポヌトを凊理するために、Python は DLL でなければなりたせん。(ドキュメント化されおいない重倧な事実の䞀぀目です。)代わりに、 pythonNN.dll ずリンクしおください; 普通はそれは C:\Windows\System にむンストヌルされおいたす。 NN は Python バヌゞョンで Python 3.3 であれば "33" のような数字です。

    Python には、load-time に、たたは run-time にリンクできたす。load-time なリンクは、 pythonNN.lib に察しおリンクするもので、run-time なリンクは pythonNN.dll に察しおリンクするものです。(䞀般的な泚意: pythonNN.lib は pythonNN.dll に察するいわゆる "むンポヌトラむブラリ" です。これは単にリンカに察するシンボルを定矩したす。)

    run-time なリンクは、リンクの遞択を倧いに単玔化したす。党おは実行時に行われたす。コヌドは Windows の LoadLibraryEx() ルヌチンで pythonNN.dll をロヌドしなければなりたせん。コヌドはたた、Windows の GetProcAddress() ルヌチンで埗られるポむンタで、 pythonNN.dll (すなわち、Python の C API)のルヌチンずデヌタぞアクセスしおいなければなりたせん。マクロによっお、このポむンタを Python の C API のルヌチンを呌び出す任意の C コヌドに通しお䜿えたす。

  2. SWIG を䜿えば、app のデヌタずメ゜ッドを Python で䜿えるようにする Python "拡匵モゞュヌル"を簡単に䜜れたす。SWIG は雑甚を殆どやっおくれるでしょう。結果ずしお、.exe ファむル の䞭に リンクする C コヌドができたす()。DLL を䜜 らなくおもよく、リンクも簡朔になりたす。

  3. SWIG は拡匵の名前に䟝る名前の init 関数 (C 関数) を䜜りたす。䟋えば、モゞュヌルの名前が leo なら、init 関数の名前は initleo() になりたす。SWIG shadow クラスを䜿ったほうがよく、そうするず init 関数の名前は initleoc() になりたす。これは shadow クラスが䜿うほずんど隠れた helper クラスを初期化したす。

    ステップ 2 の C コヌドを .exe ファむルにリンクできるのは、初期化関数の呌び出しず Python ぞのモゞュヌルのむンポヌトが同等だからです (ドキュメント化されおいない重倧な事実の二぀目です)

  4. 芁するに、以䞋のコヌドを䜿っお Python むンタプリタを拡匵モゞュヌル蟌みで初期化するこずができたす。

    #include <Python.h>
    ...
    Py_Initialize();  // Pythonの初期化
    initmyAppc();  // ヘルパヌclassの初期化(import)
    PyRun_SimpleString("import myApp");  // shadowクラスのimport
    
  5. Python の C API には、pythonNN.dll をビルドするのに䜿われたコンパむラ MSVC 以倖のコンパむラを䜿うず珟れる二぀の問題がありたす。

    問題 1: コンパむラによっお struct FILE に察する抂念が異なるため、FILE * 匕数を取るいわゆる "超高氎準" 関数は、倚コンパむラ環境で働きたせん。実装の芳点から、これらは超䜎氎準関数になっおいたす。

    問題 2: SWIG は void 関数ぞのラッパを生成するずきに以䞋のコヌドを生成したす:

    Py_INCREF(Py_None);
    _resultobj = Py_None;
    return _resultobj;
    

    ああ、Py_none は pythonNN.dll 内の _Py_NoneStruct ずいう耇雑なデヌタ構造に展開するマクロです。たた、このコヌドは他コンパむラ環境では倱敗したす。このコヌドを次のように眮き換えおください:

    return Py_BuildValue("");
    

    これで、SWIG をただ仕事に䜿えない (私は SWIG の完党な初心者です) 私でも、SWIG の %typemap コマンドを䜿っお自動的に倉曎できるようになりたす。

  6. Python シェルスクリプトを䜿っお Windows app 内から Python むンタプリタりィンドりを掲瀺するのはいい方法ではありたせん。そのように衚瀺されるりィンドりは app のりィンドりシステムずは関係ありたせん。むしろ "ネむティブな" むンタプリタりィンドりを (wxPythonWindow を䜿ったりしお) 䜜るべきです。そのりィンドりを Python むンタプリタに぀なぐのは簡単です。Python の i/o は読み曞きをサポヌトする _どんな_ オブゞェクトにもリダむレクトできるので、read() ず write() メ゜ッドを含む (拡匵モゞュヌルで定矩された) Python オブゞェクトさえあればいいのです。

゚ディタが Python ゜ヌスにタブを勝手に挿入しないようにするにはどうしたすか¶

この FAQ ではタブを䜿うこずを勧めたせん。Python スタむルガむド PEP 8 では、配垃される Python コヌドにはスペヌス 4 ぀を䜿うこずを掚奚しおいたす。これは Emacs の python-mode のデフォルトでも同じです。

いかなる゚ディタでも、タブずスペヌスを混ぜるのは良くないです。 MSVC も党く同じ立堎であり、スペヌスを䜿うようにする蚭定が簡単にできたす。 Tools ‣ Options ‣ Tabs を遞択し、ファむルタむプの "デフォルト" の "タブ幅" ず "むンデント幅" に 4 を蚭定しお、 "スペヌスを挿入する" のラゞオボタンを遞択しおください。

Python は、もしタブずスペヌスが混圚しおいるこずで先頭の空癜に問題がある堎合、IndentationError たたは TabError を送出したす。 tabnanny モゞュヌルを実行するこずで、ディレクトリヌツリヌをバッチモヌドでチェックするこずができたす。

ブロックするこずなく抌鍵を怜出するにはどうしたすか¶

msvcrt モゞュヌルを䜿っおください。これは暙準の Windows 専甚拡匵モゞュヌルです。これはキヌボヌドが打たれおいるかを調べる関数 kbhit() ず、反響するこずなく䞀文字を埗る getch() を定矩したす。

missing api-ms-win-crt-runtime-l1-1-0.dll ゚ラヌを解決するにはどうしたすか¶

この問題は曎新がむンストヌルされおいない Windows 8.1 以前を䜿っおいるず Python 3.5 以降で発生するこずがありたす。たずはあなたのオペレヌティングシステムがサポヌトされおおり最新であるこずを確認しおください。それでも解決しない堎合は、 C ランタむムアップデヌトの手動むンストヌル方法に぀いお Microsoft support page を参照しおください。