别碰我的手镯

2024-05-19 06:22:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我讨厌distutils(我猜he is the evil who does this)的一点是它改变了shebang线。换句话说,越是理性和环境的变化决定了圣经

#!/usr/bin/env python

神奇地转化为

#!/whatever/absolute/path/is/my/python

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

我这么问的原因有两个

  • 我想移动它,因为我开始在一个目录(实验)中开发,现在我想移动到一个正确的路径,但我做不到。所以我创建了一个新的virtualenv和grokproject并复制了我的文件。这解决了问题,但让我对更合理的解决方案的好奇心没有得到满足。特别是,如果对virtualenv python解释器的引用是相对的,那么问题本来就不会出现。您知道virtualenv的布局,并且可以很容易地引用virtualenv python。
  • 第二个原因是,我希望能够将virtualenv scp到另一台计算机上,并在那里运行而不会遇到麻烦。这是不可能的,如果你有硬编码的路径。

Tags: the路径目录grokvirtualenvis原因this
3条回答

当然,您可以移动开发目录。Distutils会更改运行python时应使用的python路径。当你运行建筑的时候,它在运行。移动并重新运行引导程序和构建。完成!

Distutils更改用于运行Distutils的Python的路径。如果没有,那么您可能最终会在一个python版本中安装一个库,但是当您尝试运行该脚本时,它将失败,因为它将与另一个没有库的python版本一起运行。

这不是疯狂,事实上这是唯一理智的方法。

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

/path/to/install/python setup.py build -e "/the/path/you/want/python" install

不过,请确保首先清除生成目录。:)

我没有办法解决你的问题,但我确实看到了当前distutils行为的一些基本原理。

#!/usr/bin/env python执行系统的默认Python版本。只要你的代码与上述版本兼容就可以了。当默认版本被更新(比如从2.5更新到3)时,您的代码或其他引用/usr/bin/env的Python代码可能会停止工作,即使仍然安装了旧的Python版本。因此,“硬编码”到适当的python解释器的路径是有意义的。

编辑:您断言指定python2.4或类似方法可以解决此问题是正确的。

编辑2:当同一个Python版本的多个安装出现时,事情并不像下面的注释中指出的那样清楚。

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

选项1:手动

您可以将标志--executable=/path/to/my/python传递给setup.py。论点被接受。

示例:

% python setup.py build --executable=/opt/local/bin/python -d

选项2:自动

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

% cat setup.cfg 
[build]
executable = /opt/local/bin/python -d

相关问题 更多 >

    热门问题