触らないでください私shebang
-
20-09-2019 - |
質問
ひとつのが怖い distutils (I guess 彼は、悪者はこの)この変化のshebangます。つまり、合理化-環境-varsた聖書
#!/usr/bin/env python
が魔法に変換され
#!/whatever/absolute/path/is/my/python
これがもgrok:使用したgrokprojectにvirtualenvの開始に私のプロジェクトができないので移動の展開ディレクトリ周辺のなので、入れるように絶対パスのshebangされております。
なぜ私はこの倍
- に移動しようとしていま頃に開始していますので開発に一つのディレクトリ(実験)やってきて、自分のやりたいです適切な経路が、という素晴らしいプログラムです。私は新しいvirtualenvとgrokproject、コピーマファイルです。この問題が私の好奇心をより合理的な不満を解.特にこれを参考にvirtualenv pythonインタプリタが比較的に問題なかったのではないかと思うのです。ご存知のレイアウトvirtualenv、を参照することができvirtualenv pythonです。
- 第二の理由はいきscpのvirtualenv他のコンピュータでがなります。これはできない場合はハードコードす。
解決
もちろん、あなたは周りの開発ディレクトリを移動することができます。 Distutilsのは、あなたがそれを実行したときに実行する必要があるのpythonのパスを変更します。あなたがビルドアウトを実行するとき、それは完全に理解実行であります。移動し、ブートストラップや増築を再実行します。完了!
のDistutilsはあなたとのdistutilsを実行するために使用するPythonのパスを変更します。それは、ライブラリを持っていなかった別のPythonのバージョンで実行されますので、それがなかった場合は、1つのPythonのバージョンでライブラリをインストールするに終わるかもしれないが、あなたはスクリプトを実行しようとすると、それは失敗するでしょう。
それはそれは実際にそれを行うための唯一のまともな方法だ、狂気ではありません。
アップデート: あなたは何をしているかわかっている場合は、あなたがこれを行うことができます:
/path/to/install/python setup.py build -e "/the/path/you/want/python" install
あなたがが最初にビルドディレクトリを清掃していることを確認します。 :)
他のヒント
Distutilsが自動的に置き換えのshebangの立地のPythonのバイナリを使用した実setup.py.にこの動作をオーバーライドしてオプション:
オプション1:手動で
きのフラグ --実行=/path/to/my/python へsetup.py.引数を受け入れます。
例:
% python setup.py build --executable=/opt/local/bin/python -d
オプション2:自動的に
他のオプションを追加ラインを設定します。cfg.でない場合を設定します。cfgをもと同じディレクトリsetup.py.Setup.py に見えたことで起動します。このオプションここで指定でオーバーライドするとフラグのコマンドライン。
% cat setup.cfg
[build]
executable = /opt/local/bin/python -d
ない解決の問題が、一の理由は、現在の挙動 distutils.
#!/usr/bin/env python
実行システムのデフォルトのPythonのバージョン。しかしコードに対応したバージョン。合のデフォルトのバージョンの更新から2.5-3とします)コードまたはその他のPythonコードを参照 /usr/bin/env
がものPythonのバージョンはまだ設置。そのことは、あってはならないことです"hardcode"へのパスを適切にpythonインタプリタ
編集: しかし、主張することを指定する python2.4
または類似のは、この課題を解決す.
編集2: いて明確なカットが複数の施設を同じPythonのバージョンが存在して ヴDeily ポイントにコメントします。
の最新バージョン distutils, がありフラグ --no-autoreq ている私にとって:
--no-autoreq do not automatically calculate dependencies
私の場合、作成したRPMファイルのpython2.4実行し、サーバの両方2.4 2.6設bdistで左のshebangsして、走る:
python setup.py bdist_rpm --no-autoreq
の場合はお取り扱いに スペック ファイルをご利用いただくことがでの解明 https://stackoverflow.com/a/7423994/722997, 追加:
AutoReq: no
は、同じ問題がありました。デフォルトでは完全に感動を防止するための方法を見つけることを試みました。ここでのソリューションです。基本的に、我々は、デフォルトのスクリプトのコピールーチン(build_scripts)をオーバーライドします。
setup.pyの追加
from distutils.command.build_scripts import build_scripts
# don't touch my shebang
class BSCommand (build_scripts):
def run(self):
"""
Copy, chmod each script listed in 'self.scripts'
essentially this is the stripped
distutils.command.build_scripts.copy_scripts()
routine
"""
from stat import ST_MODE
from distutils.dep_util import newer
from distutils import log
import os
self.mkpath(self.build_dir)
outfiles = []
for script in self.scripts:
outfile = os.path.join(self.build_dir, os.path.basename(script))
outfiles.append(outfile)
if not self.force and not newer(script, outfile):
log.debug("not copying %s (up-to-date)", script)
continue
log.info("copying and NOT adjusting %s -> %s", script,
self.build_dir)
self.copy_file(script, outfile)
if os.name == 'posix':
for file in outfiles:
if self.dry_run:
log.info("changing mode of %s", file)
else:
oldmode = os.stat(file)[ST_MODE] & 0o7777
newmode = (oldmode | 0o555) & 0o7777
if newmode != oldmode:
log.info("changing mode of %s from %o to %o",
file, oldmode, newmode)
os.chmod(file, newmode)
setup(name="name",
version=version_string,
description="desc",
...
test_suite='testing',
cmdclass={'build_scripts': BSCommand},
)
.. EDE / duply.net