2

Windows 7 用の Python アプリケーション用の Inno Setup インストーラーに取り組んでおり、次の要件があります。

  1. アプリは、インストール ディレクトリに何も書き込まないでください。
  2. .pyc ファイルを使用できるはずです
  3. アプリは特定の Python バージョンを必要としないため、一連の .pyc ファイルをインストーラーに追加することはできません。

これを処理するための推奨される方法はありますか? .pyc ファイルを (再) 生成する方法をユーザーに提供したいですか? それとも、.pyc ファイルによる起動時間の短縮は、通常、心配する価値がないのでしょうか?

4

3 に答える 3

0

PEP 3147をまだ読んでいない場合は、おそらくそれで質問に答えることができます。

そのPEPで説明され、Python3.2の時点で実装されているソリューションを意味するものではありません。「複数のPythonバージョン」が単に「3.2、3.3、そしておそらく将来の3.x」を意味する場合、これは素晴らしいことです。または、「2.6+と3.1+ですが、私は3.2と3.3しか気にしないので、他のもののpycスピードアップが得られなくても大丈夫です」という意味でも。

しかし、サポートされているバージョンを尋ねたところ、「2.7」と言われました。これは、問題の解決にPEP3147を使用できないことを意味します。

幸いなことに、PEPは、問題を解決するための以前の試みとそれぞれの落とし穴についての議論でいっぱいであり、オプションが何であるか、そしてそれらをどのように実装するかを理解するのに十分以上のものがあるはずです。

1つの問題は、PEPが非常にLinux中心であるということです。これは主に、過去に問題を解決しようとしたのは主にLinuxディストリビューションであるためです。(Appleもそうしましたが、彼らの解決策は(a)ほぼ機能し、(b)Mac固有の「フレームワーク」全体と緊密に結合されていたため、ほとんど無視されていました…)

そのため、「.pycファイルをWindowsのどこに置くべきか」という疑問が残ります。

最良の選択は、おそらくユーザーのローカルアプリケーションデータディレクトリの下にあるアプリ固有のディレクトリです。Vista以降が必要な場合は既知のフォルダを、必要がない場合はCSIDLを参照してください。いずれにせよ、FOLDERID_LocalAppDataまたはCSIDL_LOCAL_APPDATAを探しています。これは次のとおりです。

ローカル(非ローミング)アプリケーションのデータリポジトリとして機能するファイルシステムディレクトリ。一般的なパスはC:\Documents and Settings\username\Local Settings\Application Dataです。

重要なのは、アプリケーションがユーザーごとに(およびそのユーザーのプロファイルディレクトリ内に)データを保存する場所であり、ユーザーの移動プロファイルが最終的に使用される可能性のあるマシンごとにデータを保存する場所です。つまり、安全にデータをそこに置いて知ることができます。ユーザーにはUACが関与せずにそこに書き込む権限があり、他のユーザーやマシンがそこにあるものに干渉しないことも(そしてあなたができる限り)知っていること。

My Unique App Nameそのディレクトリ内に、プログラムのディレクトリを作成し、そこに必要なものを配置します。一意の名前(UUIDなど)を選択している限り、My Company Name\My App Name他のプログラムとの偶発的な衝突から安全です。(MSDNにはこれに関する特定のガイドラインがありましたが、現在は見つかりません。)

では、どのようにしてそのディレクトリにアクセスしますか?

最も簡単な方法は、env変数を使用することです%LOCALAPPDATA%。古いWindowsを処理する必要がある場合は、最後に使用%USERPROFILE%してタック\Local Settings\Application Dataすることができます。これは、同じであるか、ジャンクションを介して同じ場所に配置されることが保証されています。

pywin32ネイティブのWindowsAPIを使用またはアクセスすることもできctypesます(これには少なくとも3つの異なるAPIがあり、これらのAPIにアクセスする方法は少なくとも2つあるため、これを作成するためのすべての可能な方法を提供したくはありません...しかし簡単なグーグルまたは、「pywin32SHGetFolderPath」または「ctypesSHGetKnownFolderPath」など、必要なものを検索します。

または、これを処理するための複数のサードパーティモジュールがあります。GoogleとPyPIの両方が最初に登場したのはでしたwinshell

于 2013-01-18T22:39:39.670 に答える
0

PYC ファイルは、異なる Python バージョンとの互換性が保証されていません。すべての顧客が同じバージョンの Python を実行していることがわからない場合は、pyc を直接配布したくありません。そのため、PYC を配布するか、複数の Python バージョンをサポートするかを選択する必要があります。

py_compileを使用してすべてのファイルをコンパイルし、それらをバージョン固有のパッケージに圧縮するビルド プロセスを作成できます。これはsetuptools で行うことができます。; ただし、サポートする必要があるすべてのバージョンで py_compile を実行する必要があるため、面倒です。

基本的にクローズド アプリケーションを配布していて、他のユーザーがソース コードに簡単にアクセスできないようにする場合は、おそらくpy2exeの方が簡単な代替手段です。Python がユーザーの Python インストールに統合されることになっている場合、.py ファイルの zip を作成し、zipfileを使用して圧縮されたパッケージをインポートする 1 行の .py スタブを追加する方がおそらく簡単です。

気分が良くなる場合、PYC は追加のセキュリティを提供しませんし、実際にはパフォーマンスも大幅に向上させません :)

于 2013-01-18T22:16:18.983 に答える
0

元の質問を読み直すと、おそらく要件に合ったはるかに簡単な答えがあります。

私は Inno についてあまり知りませんが、ほとんどのインストーラーは、コピー後のステップとして任意のコマンドを実行する方法を提供します。

python -m compileallそのため、インストール時に を使用してファイルを作成するだけで済みますが.pyc、昇格された特権をまだ持っているので、UAC に問題はありません。

実際、pywin32インストーラー パッケージとして提供される やその他のさまざまな Python パッケージを見ると、まさにこれを行っています。これは、ライブラリをユーザーの Python インストールにインストールするための慣用的な方法であるため、ユーザーの Python インストールを使用する実行可能ファイルをインストールすることが合理的であると見なされない理由がわかりません。

もちろん、ユーザーが後で Python 2.6 をアンインストールして 2.7 をインストールすることを決定した場合、.pycファイルはホースされます... しかし、あなたの説明からすると、とにかくプログラム全体がホースされるように聞こえます。ユーザーに推奨される解決策は、おそらくアンインストールして、とにかく再インストールしますよね?

于 2013-01-19T01:52:45.627 に答える