2016-05-29 7 views
1

私はPythonで一般的な機械学習データセットを読み込むために、ばかばかしく使いやすいpipパッケージを作りたいと思っています。 (はい、いくつかのものがすでに存在しているが、私はそれがさらに簡単になりたい)setuptoolsを使用して、インストール時に外部データをダウンロードするにはどうしたらいいですか?

私は何を達成したいことはこれです:

  • ユーザーはpip install dataset
  • ピップが言う、データセットをダウンロードし実行しますwget http://mydata.com/data.tar.gzを介して。データはPythonパッケージ自体には存在しませんが、他の場所からダウンロードされることに注意してください。
  • pipは、このファイルからデータを抽出し、パッケージがインストールされているディレクトリに配置します(これは理想的ではありませんが、データセットはかなり小さいので、ここにデータを格納することは大きな問題ではないと仮定します) )
  • その後、ユーザーが自分のモジュールをインポートすると、モジュールは自動的に特定の場所からデータを読み込みます。

この質問は、箇条書き2と3についてです。setuptoolsでこれを行う方法はありますか?

答えて

1

Kevinによると、Pythonパッケージのインストールは完全に再現可能であり、潜在的な外部ダウンロードの問題は実行時にプッシュする必要があります。したがって、これはsetuptoolsで処理するべきではありません。

代わりに、ユーザーの負担を避けるために、読み込み時にデータを怠け者にダウンロードすることを検討してください。例:

def download_data(url='http://...'): 
    # Download; extract data to disk. 
    # Raise an exception if the link is bad, or we can't connect, etc. 

def load_data(): 
    if not os.path.exists(DATA_DIR): 
     download_data() 
    data = read_data_from_disk(DATA_DIR) 
    return data 

私たちは、その後、ドキュメント内download_dataを記述することもできますが、ユーザーの大半は、それを気にする必要はないだろう。これは、ユーザが外部ダウンロード自体を管理するのではなく、実行時に必要なデコーダをダウンロードすることに関するモジュールの動作と幾分似ています。

0

Pythonパッケージのインストールでは、PythonパッケージをインストールするためにPythonコードを実行してはならないと記載されています。つまり、インストール処理中にダウンロードできないことがあります。

追加データをダウンロードしたい場合は、パッケージをインポートしたときなどに、このデータをダウンロードしてどこかにキャッシュして新しいインポートごとにダウンロードしないようにしてください。

+0

インポート時の副作用は悪です。これを明示的に行う関数を提供する方がよいでしょう。たとえば、ユーザーがインターネットを使用していない場合や、あなたが期待していたデータセットではなく、「このページがブロックされています」HTMLファイルを与える悪質なMitMプロキシの背後にある場合はどうなりますか? – Kevin

0

データはPythonパッケージ自体には存在しませんが、他の場所からダウンロードされることに注意してください。

しないでください。

Pythonのパッケージ化のポイントは、のときに全く同じものをにインストールするという、完全に決定論的で、再現可能で、再利用可能な手段を提供することです。

  • エンドユーザーがコンピュータAでパッケージをダウンロードし、サムドライブに貼り付け、インターネットを持たないコンピュータBにインストールする可能性があります。
  • ウェブ上のデータが変更される可能性があります。つまり、同じパッケージをインストールする2人のユーザーが異なる結果になることがあります。
  • データを提供するWebサイトが存在しなくなるか、またはunwisely change the URLが表示されます。これは、パッケージをまだ持っている人はそれを使用できないことを意味します。
  • ユーザーはインターネットフィルタの背後にいる可能性があり、期待していたデータセットではなく、「このページがブロックされました」というHTMLファイルが表示される可能性があります。

代わりに、あなたは(setup()package_data or data_files引数を使用して)パッケージを使用してデータを含めるか、ユーザーが実行する準備ができたときに、手動でデータをダウンロードするには、あなたのPythonコード内の別々のトップレベルの機能を提供しなければならないのいずれかそう。

+0

ライセンスの問題のために、データを配布することは不可能だとしましょう。それで、あなたが言っていることは、インストール時よりも実行時に問題が出るほうが良いということです。はい? (これについては考えていなかった。私は同意すると思う)おそらく私がやることは、ランタイム時にやや上手く失敗することができる怠惰な自動ダウンロードがあるかもしれない。 – rd11

+0

いいえ明示的は暗黙的より優れています。ユーザーは何かを行うためにパッケージをインポートすることを期待していません。手動でダウンロードを開始する機能を提供します。 – Kevin

+0

私はそれがインポート時に起こることを示唆していませんでした。手動ダウンロードは、圧倒的多数のケースでは不必要な手間ではありません。 – rd11

関連する問題