10

インストール後、インストールによって作成された構成ファイルとデータ ファイルの一部へのソフト リンクを作成したいと考えています。

パッケージの setup.py 内からインストールされた新しいパッケージのファイルの場所を特定するにはどうすればよいですか?

最初はパス「/usr/local/lib/python2.7/dist-packages」をハードコードしましたが、仮想環境を使用しようとすると壊れました。(virtualenv で作成)

distutils.sysconfig.get_python_lib() を試してみましたが、それは virtualenv 内で動作します。ただし、実際のシステムにインストールすると、「/usr/lib/python2.7/dist-packages」が返されます (「ローカル」ディレクトリが存在しないことに注意してください)。

site.getsitepackages() も試しました:

ベース環境から Python シェルを実行します。

輸入サイト

site.getusersitepackages()

「/home/sarah/.local/lib/python2.7/site-packages」

site.getsitepackages()

['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']

仮想環境「testenv」から Python シェルを実行する:

輸入サイト

site.getsitepackages()

トレースバック (最新の呼び出しが最後):

ファイル ""、1 行目、

AttributeError: 'module' オブジェクトに属性 'getsitepackages' がありません

Ubuntuで「Linux2の[GCC 4.6.3]」を使用して「Python 2.7.3(デフォルト、2012年8月1日、05:14:39)」を実行しています。おそらくtry-exceptブロックと一緒に何かをまとめることができますが、distutils / setuptoolsによって設定/返される変数がいくつかあるはずです。(動作する限り、どのブランチを使用するかはわかりません。)

ありがとう。

4

2 に答える 2

1

これを行う「正しい」方法はまだ見つかっていませんが、ほぼ正しいと思われるいくつかのトリックを見つけました。1 つの方法はインストール時にのみ機能します。もう 1 つは、パッケージが既にインストールされている場合にのみ機能します。

インストールには、次のように返されるオブジェクトを使用しますsetuptools.setup()

from setuptools import setup
s = setup([...])
installation_path = s.command_obj['install'].install_lib

(これらの属性が存在するために有効なオブジェクトが必要なため、これはインストール中にのみ機能しDistributionます。知る限り、そのようなオブジェクトを取得する唯一の方法は実行することsetup()です。)

アンインストール時には、上記の @Zhenya で提案されているように、パッケージのファイル属性を使用します。唯一の難点は、 を./setup.py uninstall削除するために実行すると 、通常、packageディレクトリ./package/、、、および. (「アンインストール」オプションは、setup( を呼び出さずにコードでキャッチされます。パッケージ ファイルを削除するために手動で作成されたスクリプトを実行します。) これらは、Python インタープリターをグローバルにアクセス可能なリポジトリ以外の場所にリダイレクトできます。取り除こうとしている。これを処理するための私のハックは次のとおりです。./build./dist./package.egg-info/

import imp
import sys
from subprocess import Popen
from os import getcwd
Popen('rm -r build dist *.egg-info', shell=True).wait()
oldpath = sys.path
rundir = getcwd()
sys.path.remove(rundir)
mod = imp.find_module(PACKAGE)
p = imp.load_module(PACKAGE, mod[0], mod[1], mod[2])
sys.path = oldpath
installation_path = p.__file__

(これはインストール中には機能しません-私が思うに-Pythonは起動時にモジュールのみをインベントリするため、pythonを終了して戻ってこない限り、find_module()はインストールされたばかりのパッケージを見つけられません。)

インストールとアンインストールの両方を、ベア環境と仮想環境 (virtualenv 1.9.1 以降) でテストしました。Ubuntu 12.04 LTS、Python 2.7.3、setuptools 0.6c11 (ベア環境)、setuptools 0.7.4 (virtualenv) を実行しています。

于 2013-06-27T21:16:08.740 に答える
0

これはおそらくあなたの質問への回答にはなりませんが、インストールしたパッケージのソース コード、またはこのパッケージ内の他のファイルにアクセスする必要がある場合、最善の方法は、このパッケージを開発モードでインストールすることです (ソースを任意の場所に置き、パッケージ ソースのベース ディレクトリで python setup.py development を実行します)。これにより、パッケージがどこにあるかがわかります。

于 2013-06-25T12:01:36.817 に答える