7

私たちの店はPythonショップです。社内で開発されたさまざまなPythonパッケージがあり、お客様の環境(マシン)にデプロイされます。

これが私たちの開発とリリースサイクルがどのように行われるかです。

開発者がパッケージの「テスト」を完了すると、パッケージの配布(eggファイル)が準備され、中央のアーカイブ場所にプッシュされます。お客様にソフトウェアを展開する場合、同じディストリビューション(eggファイル)がダウンロードされ、お客様の環境にインストールされます。

「テスト」が複数のオペレーティングシステムで行われると仮定すると(プラットフォーム間のAPIの互換性を確認するため)、ディストリビューションを準備して中央のアーカイブ場所にプッシュするためのベストプラクティスは何ですか。

アーカイブサーバーにオペレーティングシステム固有の卵を置くのが最善ですか(たとえば、samplepkg-1.0.0.win32.eggやsamplepkg-1.0.0.linux.egg?setuptoolsを使用してこの方法で卵を準備する方法がわかりません)。または、APIはプラットフォーム間で同じままなので、単一の卵を持っていますか?コミュニティが従う他の慣行はありますか?

4

4 に答える 4

5

次の場合は、単一のパッケージを使用できます。

  1. このパッケージは、すべてのターゲットプラットフォームで使用できない関数/クラスを使用しません(たとえば、バージョン2.7.2のPython標準ライブラリリファレンスの36〜39章を参照して、その場合に使用してはならないものを参照してください)。
  2. すべてのプラットフォーム用にコンパイルする必要があるC/C++で記述された拡張機能を使用していません。

一般に、すべてのターゲットプラットフォームで使用できるわけではないOS固有の機能を使用しないことをお勧めします。標準ライブラリは、その点で非常によく文書化されています。

于 2012-02-20T23:01:53.357 に答える
2

この場合、ローランドが前述した理由により、単一のパッケージを使用することはより複雑になると思います。開発環境では、プラットフォームごとに別々のフォルダーを作成し、それぞれにプラットフォーム固有のコード(C / C ++で記述された拡張機能/ライブラリーなど)を含めることができます。別々の卵を生成するには、これらのフォルダー内のsetuptoolsを模倣する必要がありますが、すべてを1つのパッケージにまとめようとするよりも、最終的にはそれほど複雑ではありません(実際に使用しているコードについて詳しく知らなくても)。

いずれの場合も、標準ライブラリのドキュメントとdistutils(http://docs.python.org/distutils/)を読むと、解決策を見つけるのに役立ちます。

于 2012-02-23T05:26:05.100 に答える
1

プラットフォーム固有のeggは、Cコードを含むパッケージの配布のみを目的としています。それ以外の場合、eggファイル自体はプラットフォームに依存せず、プラットフォームに依存しない1つのeggを配布するだけで済みます。

自動インストールツールまたはpkg_resourcesのランタイムAPIを使用してライブラリとプラグインを検索している場合、実際にはすべてのエッグを1つのディレクトリにダンプするだけで、インストールツールまたはランタイムAPIがインストールまたはインポート元のエッグを選択します。

tl; drバージョン:setuptoolsが卵を作成する方法は、卵を配布する方法です。クロスプラットフォームの卵をプラットフォームに依存する卵に、またはその逆にしようとすると、多少の苦痛を経験する可能性があります。;-)

于 2012-02-23T20:48:30.343 に答える
0

Pythonモジュールしかない場合は、同じファイル(python std lib)または個別のファイル(pyserial)のいずれかで、すべての違いをPythonに隠しておきます。

モジュールをコンパイルした場合は、少し注意が必要です。

コンパイルされた拡張機能が必要なプロジェクトには、次のディレクトリ構造を使用します。

./lib/display.py  # frontend, platform-independent
./lib.linux-x86_64-2.6/_display.so
./lib.linux-armv5tejl-2.6/_display.so

そして、プログラムの最初のこのコード:

sys.path.append("lib.%s-%s-%s.%s" % ((posix.uname()[0].lower(),
                                      posix.uname()[4])
                                     +sys.version_info[:2]))

zipセーフでないことを指定する限り、このような構造を.eggでラップすることもできます。

于 2012-03-08T13:03:47.857 に答える