40

Python モジュール名と easy_install で使用される実際のパッケージ名の背後にあるロジックを知っている人はいますか?

私には少し非論理的に見えるいくつかの(とりわけ)例:

  • 私たちはそうしますeasy_install mysql-pythonが、インポートは実際にはimport MySQLdb
  • を行いますeasy_install python-memcachedが、インポートは実際にはimport memcache(末尾の d なしで)

同等性を見つける一貫した方法が見つかりませんでした。一部のモジュールでは、それを見つけるのに多くのブラウジングが必要でした。私は何を間違っていますか?

4

2 に答える 2

20

残念ながら、狂気への方法はありません。パッケージ インデックス内の名前は、モジュール名とは無関係ですimport。悲惨なことに、一部のパッケージはモジュール名を共有しています。両方をインストールすると、アプリケーションは偶数確率で壊れます。(Rubyにもこの問題があります


Python でのパッケージ化は、一般的に悲惨です。根本的な原因は、言語がパッケージ マネージャーなしで出荷されていることです。Ruby と Nodejs には、フル機能のパッケージ マネージャーである Gem と Npm が同梱されており、GitHub を中心とした共有コミュニティが育まれています。Npm を使用すると、パッケージをインストールするのと同じくらい簡単にパッケージを公開できます。Nodejs は 2009 年に登場し、すでに 14,000 個のパッケージがあります。由緒ある Python パッケージ インデックスには 24k がリストされています。Ruby Gems には 44,000 個のパッケージがリストされています。

幸いなことに、 Pipと呼ばれる Python 用の適切なパッケージ マネージャーが 1 つあります。Pip は Ruby の Gem にインスパイアされていますが、いくつかの重要な機能 (パッケージの一覧表示、まとめてのアップグレードなど) が欠けています。皮肉なことに、Pip 自体のインストールは複雑です。一般的な 64 ビット Windows にインストールするには、ソースから 2 つのパッケージをビルドしてインストールする必要があります。これは、プログラミングを始めたばかりの人にとって大きな質問です。

Python の開発者は、ソースからのビルドに慣れた経験豊富なプログラマーであり、パッケージ化された Python モジュールを含む Linux ディストリビューションを使用しているため、このフラストレーションのすべてに無知です。

Python がパッケージ マネージャーと共に出荷されるまで、何千人もの開発者が車輪の再発明に無駄に時間を浪費することになります。


Python 3 は、パッケージングに関する多くの問題を解決します。Python 3 用のパッケージはありません

于 2012-07-12T14:24:19.590 に答える
14

受け入れられた答えが示唆するのとは異なり、実際には可能ですが、実際には非常に面倒です。

top_level.txtモジュール名は、パッケージ インストールのメタデータ ディレクトリ内のファイルで見つけることができます。

python-memcachedPython でアクセスするには (パッケージ名に置き換えてください):

>>> import pkg_resources as pkg # included in setuptools package
>>> metadata_dir = pkg.get_distribution('python-memcached').egg_info
>>> open('%s/%s' % (metadata_dir, 'top_level.txt')).read().rstrip()
'memcache'

または同等のbash「ワンライナー」を使用:

cat $(python -c "import pkg_resources; \
print(pkg_resources.get_distribution('python-memcached').egg_info)")/top_level.txt

一部のパッケージは複数のモジュールをインストールするため、ここで紹介するメソッドは複数のモジュール名を返す可能性があることに注意してください。

于 2019-02-24T14:50:55.847 に答える