インポートできるように、自分のPythonモジュールをどこに置くべきですか


89

私はPythonで独自のパッケージを持っており、それを頻繁に使用しています。PYTHONPATHまたはsys.pathを使用せずにインポートされるように、パッケージを配置する必要がある最もエレガントな、または従来のディレクトリは何ですか?

たとえば、サイトパッケージはどうですか? /usr/lib/python2.7/site-packages
Pythonでは、パッケージをコピーしてそこに貼り付けるのが一般的ですか?


1
依存関係とそうでないものを伝えるsetup.pyを作成し、それを使用する方がより適切で移植性が高くなります...しかし、通常はコピー/貼り付けで問題なく動作します...通常は「user / lib /」という追加のフォルダーを作成しますが"または何か、それらをすべてそこに置いて、それが私のPYTHONPATHにあることを確認してください
Joran Beasley

1
本当の答え:@JoranBeasleyのような個人的な単純なスクリプト/非配布パッケージに対する他の答えも好きではありません:スクリプトを保持するためのフォルダー(またはそれらへのリンク)を作成し、そのフォルダーをbash内からPYTHONPATHに追加しますrunco​​mツリー(たとえば、スクリプト/リンクを~/foo/bar/挿入export PYTHONPATH=~/foo/bar # fields separated by ":"し、~/.bashrcファイルに追加します)。man pythonこの手動パスは、デフォルトのPython検索パスの前にあります。を参照してください。名前の衝突に注意してください。

回答:


64

私は通常、インポートする準備ができているものをユーザーサイトディレクトリに置きます。

~/.local/lib/pythonX.X/site-packages

プラットフォームに適したディレクトリを表示するには、次を使用できます python -m site --user-site


編集:sys.path作成すると表示されます:

mkdir -p "`python -m site --user-site`"

ターミナルからPythonを開くと、これがsys.pathによって提供されます。ローカル[''、 '/ usr / lib64 / python27.zip'、 '/ usr / lib64 / python2.7'、 '/ usr / lib64 / python2.7 / plat-linux2'、 '/ usr /がないことに注意してくださいlib64 / python2.7 / lib-tk '、' /usr/lib64/python2.7/lib-old '、' /usr/lib64/python2.7/lib-dynload '、' /usr/lib64/python2.7 / site-packages '、' /usr/lib64/python2.7/site-packages/PIL '、' /usr/lib64/python2.7/site-packages/gst-0.10'、'/usr/lib64/python2。 7 / site-packages / gtk-2.0 '、' /usr/lib/python2.7/site-packages '、' /usr/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg -info ']
Cobry 2013

スクリプトを実行すると、次のようになります['/home/username/Desktop/mypackage/Examples'、'/usr/lib64/python27.zip'、'/usr/lib64/python2.7'、'/usr/lib64 /python2.7/plat-linux2 '、' /usr/lib64/python2.7/lib-tk '、' /usr/lib64/python2.7/lib-old '、' /usr/lib64/python2.7/ lib-dynload '、' /usr/lib64/python2.7/site-packages '、' /usr/lib64/python2.7/site-packages/PIL '、' /usr/lib64/python2.7/site-packages /gst-0.10 '、' /usr/lib64/python2.7/site-packages/gtk-2.0 '、' /usr/lib/python2.7/site-packages '、' /usr/lib/python2.7/ site-packages / setuptools-0.6c11-py2.7.egg-info ']
Cobry 2013

python -m site --user-site /home/username/.local/lib/python2.7/site-packagesですが、これはsys.pathには含まれていません!!
コブリー2013

@Cobrypython -m site --user-siteは、作成するディレクトリを教えてくれます。sys.modules実際に作成するまで表示されません。

@mataおそらく、に変更mkdirmkdir -pて中間ディレクトリを作成する必要があります。私も持っていませんでした~/.local。;-)

27

したがって、私のような初心者やディレクトリがあまりよく整理されていない場合は、この方法を試してみてください。

Pythonターミナルを開きます。私の場合、numpyなどの動作がわかっているモジュールをインポートして、次の手順を実行します。 Import numpy

numpy.__file__

その結果、

'/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site- packages/numpy/__init__.py'

結果numpy.__file__は、モジュールと一緒にpythonファイルを配置する必要がある場所です(を除くnumpy/__init__.py)ので、私にとっては

/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site- packages

これを行うには、ターミナルに移動して次のように入力します

mv "location of your module" "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site- packages"

これで、モジュールをインポートできるようになります。


どうして私のPythonで「._file_」が機能しないのですか?>>> import re >>> re._file_ Traceback(最後の最後の呼び出し):ファイル "<pyshell#10>"、1行目、<module> re._file_ AttributeError:module're 'には属性' file 'がありません
ウルソ

3
@Urso 2つのアンダースコアを使用していますか?コマンドre.__file__は私のために働いた。
arie64 2018年

このようなクリーンなソリューションを提供してくれた@ arie64に感謝します。私にとってもうまくいきました!!
bmsbharadwaj19年

おかげでこれは私にもうまくいきました。しかし、奇妙なことに、モジュールを送信したディレクトリ/フォルダがファイルエクスプローラーに見つかりません。フォルダが存在しないようです。フォルダが表示されるべき場所に表示されない理由はありますか?(「非表示のアイテムを表示する」を有効にしているので、それだけではありません...)
アンドレ

7

これは私にとってはうまくいくものです(プライベートpipリポジトリにアップロードされるPythonパッケージを頻繁に作成する必要があります)。質問に対する@joranのコメントについて詳しく説明します。

  1. パッケージを作成するためのワークスペースとして使用される「ビルドディレクトリ」を作成します。選択した任意のディレクトリで実行できます
  2. そこにPythonパッケージディレクトリをコピーし、setup.pyファイルを作成します。これは、setup.pyを正しく作成するのに役立ちます。
  3. 作業中のプロジェクトのvirtualenvを作成します。virtualenvsには他にもたくさんの利点がありますが、ここでは詳しく説明しません。
  4. ローカルdistパッケージを作成しますpython setup.py sdist --format=tar。作成されたパッケージは、理想的にはdistフォルダー内にある必要があります。
  5. パッケージをvirtualenvにインストールします(アクティブ化した後)。 pip install <yourpackage>.tar

pip install --force-reinstallライブラリをもっといじって、distパッケージを再作成する必要がある場合に使用できます。

私はこの方法が私にとって素晴らしいことを発見しました。ローカルだけでなく他のシステムを使用するためにモジュールをパッケージ化する必要がない場合、この方法はやり過ぎかもしれません

ハッピーハッキング。


1

私のMacでは、を実行しましたsudo find / -name "site-packages"。それは私のようないくつかのパスを与えた/Library/Python/2.6/site-packages/Library/Python/2.7/site-packages/opt/X11/lib/python2.6/site-packages

そのため、v2.7またはv2.6を使用している場合、モジュールを配置する場所を知っていました。

それが役に立てば幸い。


1

インポートフォルダは、次のソースコードを追加することで抽出できます。

import sys
print sys.path

自動シンボリックリンク生成の例は次のようになります。

ln -s \`pip show em | grep "Location"| cut -d " " -f2\` \`python -m site --user-site\`

「em」の代わりに、「インストールしたばかりなのにPythonが認識できない」他のパッケージを使用することもできます。

以下、コメントで求められていることを詳しく説明します。

次のコマンドを使用してPythonモジュールemまたはpyserialをインストールしたとします(例はubuntu用です)。

sudo pip install pyserial

出力は次のようになります。

Collecting pyserial
  Downloading pyserial-3.3-py2.py3-none-any.whl (189kB)
    100% |████████████████████████████████| 194kB 2.3MB/s 
Installing collected packages: pyserial
Successfully installed pyserial-3.3

質問は次のようになります-Pythonはモジュールpyserialを認識できません、なぜですか?モジュールがインストールされている場所は、Pythonが特定のユーザーアカウントを探している場所ではないためです。

解決策-pyserialが到着したパスからPythonが探しているパスへのシンボリックリンクを作成する必要があります。

シンボリックリンク作成コマンドは次のようになります。

ln -s <what_to_link> <where_to_link>

正確な場所を入力する代わりに、コマンドを実行してモジュールが保存されている場所を教えてくれるようにpipに要求しています。

pip show pyserial | grep "Location"| cut -d " " -f2

正確な場所を入力する代わりに、コマンドを実行して、インストールされているモジュールを探す場所をPythonに指示します。

python -m site --user-site

両方のコマンドは「 `」文字でエスケープする必要があります(通常、USキーボードの1ボタンの左側にあります)

その結果、次のコマンドがlnに提供され、欠落しているシンボリックリンクが作成されます。

ln -s /usr/local/lib/python2.7/dist-packages /home/<your_username>/.local/lib/python2.7/site-packages 

または、ディストリビューションとpython / pipのデフォルトに応じて、同様のもの。


強力なワンライナーのように見えます... Linux初心者のために少し説明していただけますか?人々は理解できないものを使うのを警戒するかもしれません:
ピアノジェームズ2017年

-1

モジュールを開発している場合は、これに従うことをお勧めします。

import sys
sys.path.append("/home/mylinux/python-packages")

これで、保持してpython-packagesいるモジュールはすべて、によってインポートできますPython-interpreter

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.