14

私は次のものを作成しようとしています:

任意のシステム (以前のバージョンの python または python がインストールされていないもの) で実行でき、さまざまな python パッケージ (つまり、django、lxml、pysqlite など) で事前構成されている python のポータブル バージョン

上記に最も近いのはvirtualenvですが、これはこれまでのところしかありません。

1 台のマシンで Python 用の素敵な virtualenv をパッケージ化すると、必要な多くのライブラリへのシンボリック リンクが含まれます。これらのシンボリック リンクを実際のファイルに変換することはできますが、このディレクトリ全体を別のマシンに移動しようとすると、seg fault が次々と発生します。

別のマシンで python を起動するには、次を使用しています。

LD_LIBRARY_PATH=lib/ ./bin/python

lib/ には、元のマシンからコピーしたすべての共有ライブラリがあります。ここでの問題は、これらの共有ライブラリが、私が含めていない他の共有ライブラリに依存している可能性があるため、他の Linux ディストリビューションでこれを実行しても機能しないことです。おそらく、システムにインストールされた古い共有ライブラリにフォールバックしたためで、コピーしたものでは機能しません。

誰でもこれを機能させる方法について考えがありますか? これは可能ですか?

編集:

明確にするために、望ましい結果は、Linuxベースのシステム(ubuntu 8.04、redhat 5、suseなど)で抽出して実行できるpythonバイナリと関連パッケージ(django、lxml、pysqliteなど)のtar.gzを作成することです。 11 など)、すべての 32 ビット ディストリビューション。ローカルにインストールされたバージョンの python は、tar.gz の内容に影響しません。

4

6 に答える 6

8

これをテストしたところ、うまく機能します。

インストールする python のコピーを取得して untar し、最初に untarred フォルダーに移動します。

また、setuptools のコピーを取得し、それを untar します。

/opt/portapy以下で使用されているのはもちろん、この投稿のために私が思いついた名前です。これは任意のパスである可能性があり、絶対パス リンクのために、これを配置するすべてのシステムで同じパスを使用する必要があります。

mkdir /opt/portapy
cd <python source dir>
./configure --prefix=/opt/portapy && make && make install
cd <setuptools source dir>
/opt/portapy/bin/python ./setup.py install

portapy フォルダー内に仮想環境フォルダーを作成します。

mkdir /opt/portapy/virtenv
/opt/portapy/bin/virtualenv /opt/portapy/virtenv
cd /opt/portapy/virtenv
source bin/activate

終わり。ここにすべてのライブラリをインストールする準備ができており、この方法で複数の仮想環境を作成するオプションがあります。

/opt/portapyその後、フォルダー全体を tar して、同じアーキテクチャの任意の Linux システムに転送することができます。

2.7.5 ond centOS 5.8 64bit をコンパイルし、フォルダーを Cent6.9 システムに移動したところ、完全に動作しました。

于 2013-09-11T21:44:12.343 に答える
7

どうすればこれが可能かわかりません。もしそうなら、彼らは異なるプラットフォームにPythonのバイナリパッケージを配布する必要はありません。どのプラットフォームでも実行できるPythonを単純に配布することはできません。そのアーチのソースから構築する必要があります。Virtualenvは、(リンクを使用して)どのシステムPythonを使用するかを指示することを期待します。

これは、システムライブラリに対してリンクするほとんどすべてのバイナリパッケージに当てはまります。繰り返しになりますが、可能であれば、プラットフォーム固有のバイナリ配布は必要ありません。

ただし、必要なことの一部を達成することはできます。つまり、同じアーチである限り、Pythonがインストールされていない別のマシンでPythonを実行します。これは、フリーズ、またはpy2exe / py2app/pyinstallerの背後にある同じ概念です。インタプリタはスタンドアロン環境にバンドルされています。そのため、アプリは同様のプラットフォームで実行できます。

編集

あなたの質問は「システム」について無差別に語っていますが、あなたのタイトルには「linux」という参照が含まれていることに気づきました。Linuxにはさまざまな種類があるため、Linuxを機能させるには、複数のアーチ用にLinuxを構築し、スタンドアロンリンクを完全に含める必要があります。pyinstallerを使用してパッケージを作成し、それを使用してプロジェクトに含めることをお勧めします。

virtualenvで、ソースからpythonをビルドしてみてください。

$ ./configure --prefix=/path/to/virtualenv && make && make install

それでもライブラリへのリンクに問題がある場合は、静的にビルドすることを検討することもできます

于 2012-06-28T17:44:19.893 に答える
2

Python だけで作業することが、ここまでの道のりであるかどうかはわかりません。ローカル環境を作成するために使用できる構成ツールである Puppet of Chef を使用すると、うまくいくかもしれません。ほぼすべての Linux と OSX (おそらく Windows ではない) に virtualenv と python をインストールするためのコードがたくさんあります。

ワークフローは、chef または Puppet (選択) をインストールし、スクリプトを実行して必要な Python をインストールし、virtualenv を入力して、必要なパッケージを pip でインストールします。

申し訳ありませんが、これは virtualenv 単独ほど簡単ではありませんが、はるかに堅牢です。

于 2012-06-28T18:12:00.297 に答える
1

まあ、「出来ない」はめったに認めないので、やる方法はあります。警告: 見栄えがよくないので、おそらく別のシナリオを検討する必要があります。

この最上位ディレクトリの標準的な場所を決定する必要があります。次に、そのディレクトリをルートとして使用して、これを実行する各 Linux ディストリビューションで Python をコンパイルする必要があります。これには、「/usr/local/myappname/platform/」のようなものを使用して、Python を構成およびコンパイルして、そこに住みます。それぞれの場合で、「platform」を「/usr/local/rhel/」などのプラットフォームの名前に置き換えます。 "。メモリが構成オプションを提供する場合、ここで探しているのは --prefix です。

各ディストリビューションをコンパイルしたら、どのディストリビューションを使用するかを決定し、環境変数を設定するか、Python の適切な「インストール」へのシンボリック リンクを作成するスクリプトが必要になります。次に、そのツリーでvirtualenvとbootstrapを使用して、「使用中の」pythonライブラリをさらに具体的に保ちます。

デフォルトで Python を持たない一般的な Linux ディストリビューションは考えられません。そのため、setup.py および/または基本的な python スクリプトを使用して、これをスクリプト化することができます。これは、RHEL のように古いバージョンがインストールされている場合でも、存在する Python に依存できるはずだからです。個人的には、上記の方法は非常に複雑だと思いますが、最終的なスクリプトを考慮して、指定された要件を満たすことができます。もちろん、shar (SHell ARchive) を使用してこれらすべてを実行可能なシェル スクリプトに tar し、インストールを実行してセカンダリ スクリプトの必要性を回避することもできます。結果のシェル アーカイブを gzip すると、ターゲット システムで解凍し、実行してすべてをセットアップできます。

とはいえ、これはお勧めしません。実行できる最小の Python バージョンを決定し、可能な限りディストリビューションによってインストールされていることを確認し、必要に応じてリポジトリからプルダウンしてインストールすることをお勧めします。次に、virtualenv と bootstrap を requirements.txt と共に使用して、必要な Python ライブラリとアプリを virutalenv にインストールします。そのためには、このドキュメントを参照してください

于 2012-06-30T22:26:58.090 に答える