Windows上のPythonに関するFAQ
WindowsでPythonプログラムを実行するにはどうすればよいですか?
これは必ずしも簡単な質問ではありません。 Windowsコマンドラインからのプログラムの実行に既に精通している場合は、すべてが明白に見えます。 それ以外の場合は、もう少しガイダンスが必要になる場合があります。
ある種の統合開発環境を使用しない限り、Windowsコマンドを「DOSウィンドウ」または「コマンドプロンプトウィンドウ」とさまざまに呼ばれるものに入力することになります。 通常、cmd
を検索すると、検索バーからこのようなウィンドウを作成できます。 通常は次のようなWindowsの「コマンドプロンプト」が表示されるため、このようなウィンドウをいつ開始したかを認識できるはずです。
C:\>
文字が異なる場合があり、その後に他のものがある場合があるため、次のようなものを簡単に確認できます。
D:\YourName\Projects\Python>
コンピュータがどのように設定されているか、および最近コンピュータで何をしたかによって異なります。 このようなウィンドウを開始すると、Pythonプログラムを実行できるようになります。
Pythonスクリプトは、Python インタプリタと呼ばれる別のプログラムで処理する必要があることを理解する必要があります。 インタプリタはスクリプトを読み取り、それをバイトコードにコンパイルしてから、バイトコードを実行してプログラムを実行します。 では、インタプリタがPythonを処理するようにどのように調整しますか?
まず、コマンドウィンドウが「py」という単語をインタープリターを起動するための指示として認識していることを確認する必要があります。 コマンドウィンドウを開いた場合は、コマンドpy
を入力して、returnキーを押してみてください。
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の最も強力な機能の1つです。 選択した式をいくつか入力して結果を確認し、確認してください。
>>> print("Hello")
Hello
>>> "Hello" * 3
'HelloHelloHello'
多くの人がインタラクティブモードを便利でありながら高度にプログラム可能な計算機として使用しています。 インタラクティブなPythonセッションを終了する場合は、 exit()関数を呼び出すか、 Ctrl キーを押しながら Z を入力し、「 Enter 」キーを押して、Windowsコマンドプロンプトに戻ります。
また、>>>
プロンプトが表示される場合があります。窓。 その場合、 exit()関数を呼び出すか、 Ctrl-Z 文字を入力すると、ウィンドウが消えます。 Windowsはウィンドウ内で単一の「python」コマンドを実行しており、インタープリターを終了するとコマンドを閉じます。
py
コマンドが認識されたことがわかったので、Pythonスクリプトをそれに与えることができます。 Pythonスクリプトへの絶対パスまたは相対パスを指定する必要があります。 Pythonスクリプトがデスクトップにあり、hello.py
という名前で、コマンドプロンプトがホームディレクトリで適切に開かれているため、次のようなものが表示されているとします。
C:\Users\YourName>
そこで、py
コマンドに、py
に続けてスクリプトパスを入力して、スクリプトをPythonに渡すように依頼します。
C:\Users\YourName> py Desktop\hello.py
hello
Pythonスクリプトを実行可能にするにはどうすればよいですか?
Windowsでは、標準のPythonインストーラーはすでに.py拡張子をファイルタイプ(Python.File)に関連付け、そのファイルタイプにインタープリター(D:\Program Files\Python\python.exe "%1" %*
)を実行するopenコマンドを提供します。 これは、コマンドプロンプトから「foo.py」としてスクリプトを実行可能にするのに十分です。 拡張子を付けずに「foo」と入力するだけでスクリプトを実行できるようにする場合は、PATHEXT環境変数に.pyを追加する必要があります。
Pythonの起動に時間がかかることがあるのはなぜですか?
通常、PythonはWindowsで非常に高速に起動しますが、Pythonの起動に突然長い時間がかかり始めるというバグレポートがときどきあります。 Pythonは、同じように構成されているように見える他のWindowsシステムでも正常に動作するため、これはさらに不可解になります。
この問題は、問題のあるマシンのウイルスチェックソフトウェアの設定ミスが原因である可能性があります。 一部のウイルススキャナーは、ファイルシステムからのすべての読み取りを監視するようにスキャナーが構成されている場合、2桁の起動オーバーヘッドが発生することが知られています。 システム上のウイルススキャンソフトウェアの構成をチェックして、それらが実際に同じように構成されていることを確認してください。 マカフィーは、すべてのファイルシステムの読み取りアクティビティをスキャンするように構成されている場合、特定の違反者です。
Pythonスクリプトから実行可能ファイルを作成するにはどうすればよいですか?
実行可能ファイルの作成に使用できるツールのリストについては、 Pythonスクリプトからスタンドアロンバイナリを作成するにはどうすればよいですか?を参照してください。
*.pydファイルはDLLと同じですか?
はい、.pydファイルはdllですが、いくつかの違いがあります。 foo.pyd
という名前のDLLがある場合は、関数PyInit_foo()
が必要です。 次に、Pythonの「importfoo」を記述できます。Pythonはfoo.pyd(およびfoo.py、foo.pyc)を検索し、見つかった場合は、PyInit_foo()
を呼び出して初期化します。 .exeをfoo.libにリンクしないでください。リンクすると、WindowsでDLLが存在する必要があります。
foo.pydの検索パスはPYTHONPATHであり、Windowsがfoo.dllの検索に使用するパスと同じではないことに注意してください。 また、プログラムを実行するためにfoo.pydが存在する必要はありませんが、プログラムをdllにリンクしている場合は、dllが必要です。 もちろん、import foo
と言いたい場合は、foo.pydが必要です。 DLLでは、リンクは__declspec(dllexport)
を使用してソースコードで宣言されます。 .pydでは、リンケージは使用可能な関数のリストで定義されます。
PythonをWindowsアプリケーションに埋め込むにはどうすればよいですか?
PythonインタープリターをWindowsアプリに埋め込むことは、次のように要約できます。
Pythonを.exeファイルに直接ビルドしないでください。 Windowsでは、Pythonはそれ自体がDLLであるモジュールのインポートを処理するためのDLLである必要があります。 (これは文書化されていない最初の重要な事実です。)代わりに、
pythonNN.dll
にリンクしてください。 通常、C:\Windows\System
にインストールされます。 NN はPythonバージョンであり、Python3.3の場合は「33」などの番号です。Pythonには2つの異なる方法でリンクできます。 ロード時のリンクは
pythonNN.lib
に対してリンクすることを意味し、ランタイムリンクはpythonNN.dll
に対してリンクすることを意味します。 (一般的な注意:pythonNN.lib
は、pythonNN.dll
に対応するいわゆる「インポートライブラリ」です。 リンカのシンボルを定義するだけです。)実行時のリンクにより、リンクオプションが大幅に簡素化されます。 すべては実行時に発生します。 コードは、Windows
LoadLibraryEx()
ルーチンを使用してpythonNN.dll
をロードする必要があります。 コードは、WindowsGetProcAddress()
ルーチンによって取得されたポインターを使用して、pythonNN.dll
(つまり、PythonのC API)のアクセスルーチンとデータも使用する必要があります。 マクロは、これらのポインターの使用を、PythonのCAPIのルーチンを呼び出すCコードに対して透過的にすることができます。ボーランド注:最初にCoff2Omf.exeを使用して、
pythonNN.lib
をOMF形式に変換します。SWIGを使用する場合、アプリのデータとメソッドをPythonで利用できるようにするPythonの「拡張モジュール」を簡単に作成できます。 SWIGはあなたのためにほとんどすべての汚れた詳細を処理します。 その結果、.exeファイルにをにリンクするCコードが作成されます(!)。DLLファイルを作成する必要はありません。これにより、リンクも簡単になります。
SWIGは、名前が拡張モジュールの名前に依存するinit関数(C関数)を作成します。 たとえば、モジュールの名前がleoの場合、init関数はinitleo()と呼ばれます。 SWIGシャドウクラスを使用する場合は、必要に応じて、init関数はinitleoc()と呼ばれます。 これにより、シャドウクラスで使用されるほとんど隠されたヘルパークラスが初期化されます。
手順2のCコードを.exeファイルにリンクできる理由は、初期化関数を呼び出すことは、モジュールをPythonにインポートすることと同じだからです。 (これは、文書化されていない2番目の重要な事実です。)
つまり、次のコードを使用して、拡張モジュールでPythonインタープリターを初期化できます。
#include "python.h" ... Py_Initialize(); // Initialize Python. initmyAppc(); // Initialize (import) the helper class. PyRun_SimpleString("import myApp"); // Import the shadow class.
PythonのCAPIには2つの問題があり、PythonNN.dllのビルドに使用されるコンパイラであるMSVC以外のコンパイラを使用すると明らかになります。
問題1:FILE *引数をとるいわゆる「非常に高レベル」の関数は、マルチコンパイラ環境では機能しません。これは、各コンパイラの構造体FILEの概念が異なるためです。 実装の観点からは、これらは非常に_低レベルの関数です。
問題2:void関数へのラッパーを生成するときに、SWIGは次のコードを生成します。
Py_INCREF(Py_None); _resultobj = Py_None; return _resultobj;
残念ながら、Py_Noneは、pythonNN.dll内の_Py_NoneStructと呼ばれる複雑なデータ構造への参照に展開されるマクロです。 繰り返しますが、このコードはマルチコンパイラ環境では失敗します。 このようなコードを次のように置き換えます。
return Py_BuildValue("");
SWIGの
%typemap
コマンドを使用して自動的に変更を加えることができる場合がありますが、これを機能させることはできません(私は完全なSWIG初心者です)。Pythonシェルスクリプトを使用して、Windowsアプリ内からPythonインタープリターウィンドウを表示することはお勧めできません。 結果のウィンドウは、アプリのウィンドウシステムから独立しています。 むしろ、あなた(またはwxPythonWindowクラス)は「ネイティブ」インタープリターウィンドウを作成する必要があります。 そのウィンドウをPythonインタープリターに接続するのは簡単です。 PythonのI / Oを読み取りと書き込みをサポートする_any_オブジェクトにリダイレクトできるため、必要なのはread()メソッドとwrite()メソッドを含むPythonオブジェクト(拡張モジュールで定義)だけです。
編集者がPythonソースにタブを挿入しないようにするにはどうすればよいですか?
FAQはタブの使用を推奨しておらず、Pythonスタイルガイド PEP 8 は、分散Pythonコード用に4つのスペースを推奨しています。 これはEmacsのpython-modeのデフォルトでもあります。
どのエディターでも、タブとスペースを混在させることはお勧めできません。 MSVCはこの点で違いはなく、スペースを使用するように簡単に構成できます。
を選択し、ファイルタイプ「デフォルト」の場合は「タブサイズ」と「インデントサイズ」を4に設定します。 「スペースの挿入」ラジオボタンを選択します。タブとスペースが混在しているために先頭の空白で問題が発生している場合、Pythonは IndentationError または TabError を発生させます。 tabnanny モジュールを実行して、バッチモードでディレクトリツリーを確認することもできます。
ブロックせずにキーが押されたことを確認するにはどうすればよいですか?
msvcrt モジュールを使用します。 これは、標準のWindows固有の拡張モジュールです。 キーボードのヒットがあるかどうかをチェックする関数kbhit()
と、エコーせずに1文字を取得するgetch()
を定義します。