别碰我的shebang

Ste*_*ini 25 python distutils virtualenv

我讨厌distutils的一件事(我猜他是这样做的邪恶者)是它改变了shebang线.换句话说,更合理的环境变量决定了经文

#!/usr/bin/env python
Run Code Online (Sandbox Code Playgroud)

神奇地转换成了

#!/whatever/absolute/path/is/my/python
Run Code Online (Sandbox Code Playgroud)

这也可以用grok看到:我在virtualenv中使用了grokproject来启动我的项目,但是现在我不能再将开发目录移动了,因为它在shebang指令中放置了绝对路径.

我之所以这样问是双重的

  • 我想移动它,因为我开始在一个目录(实验)开发,现在我想把它移动到一个正确的路径,但我不能这样做.所以我创建了一个新的virtualenv和grokproject并复制了我的文件.这解决了这个问题,但让我对一个更加理性的解决方案的好奇心不满意.特别是,如果对virtualenv python解释器的引用是相对的,那么问题就不会出现在第一位.你知道virtualenv的布局,你可以轻松地参考virtualenv python.
  • 第二个原因是我希望能够将virtualenv scp到另一台计算机并在那里运行它没有问题.如果您有硬编码路径,则无法进行此操作.

Len*_*bro 14

当然,您可以移动开发目录.Distutils会更改运行它时应运行的python路径.运行buildout时,它在Grok运行中.移动并重新运行引导程序和构建.完成!

Distutils改变了用于运行distutils的Python的路径.如果没有,那么你最终可能会在一个python版本中安装一个库,但是当你尝试运行脚本时它会失败,因为它会运行另一个没有库的python版本.

这不是疯狂,它实际上是唯一理智的方式.

更新:如果您知道自己在做什么,可以这样做:

/path/to/install/python setup.py build -e "/the/path/you/want/python" install
Run Code Online (Sandbox Code Playgroud)

确保首先清理构建目录.:)


jat*_*ism 10

Distutils会自动将shebang替换为用于执行setup.py的Python二进制文件的位置.要覆盖此行为,您有两个选择:

选项1:手动

您可以将标志--executable =/path /传递给/ my/python到setup.py.参数被接受.

例:

% python setup.py build --executable=/opt/local/bin/python -d
Run Code Online (Sandbox Code Playgroud)

选项2:自动

您的另一个选择是在setup.cfg中添加一行.如果您不使用setup.cfg,请在setup.py所在的目录中创建它.Setup.py在启动时查找此内容.此处指定的任何选项仍可在命令行中使用标志覆盖.

% cat setup.cfg 
[build]
executable = /opt/local/bin/python -d
Run Code Online (Sandbox Code Playgroud)