42

我有一个希望在全球范围内可用的脚本。我从标准的 hashbang 开始:

#! /usr/bin/env python

并将其链接到我的 virtualenv 的 bin 目录中:

~/environments/project/env/bin/myscript

并将该目录添加到我的路径中。当我运行命令时:

myscript

我收到其中一个库的导入错误。但是,如果我激活虚拟环境并运行脚本,它会按预期工作。

我已经排除了符号链接的问题(我也尝试将脚本移动到 bin 文件夹中)。我也试过用 python 运行脚本

python ~/environments/project/env/bin/myscript

以前我使用的是激活环境然后运行我的脚本的脚本,但我的印象是从这个文件夹运行的脚本应该与 virtualenv 的解释器和站点包一起运行。关于为什么这可能不起作用或我可以调试它的一些方法的任何想法?

4

5 回答 5

66

将脚本放入您的 virtualenv 的 bin 中,然后将该 bin 位置添加到您的全局 PATH 将不会自动获取您的 virtualenv。您确实需要先获取它以使其处于活动状态。

您的系统所知道的就是检查可执行文件的额外路径并运行它。该脚本中没有任何内容表明 virtualenv。

但是,您可以将 she-bang 行硬编码到您的 virtualenv python,在这种情况下,站点包将最终出现在路径上:

#!/Users/foo/environments/project/env/bin/python

或者另一种选择是简单地创建一个调用原始 pythons 脚本的小型 bash 包装器,这将允许您使用通用 she-bang 保留原始脚本。

所以如果 myscript.py 是: #!/usr/bin/env python...

然后你可以做一个myscript

#!/bin/bash

/Users/foo/environments/project/env/bin/python myscript.py

当您这样做时myscript,它将使用您设置的解释器显式调用您的 python 脚本。

于 2012-08-15T01:51:21.953 回答
16

我认为您对 virtualenv 的工作方式感到困惑。

简而言之,virtualenv 会修改您的 shell 环境,以便 Python 将在不同的区域查找您要导入的模块。存储虚拟环境的位置与存储在 virtualenv 中运行的源文件的位置之间确实没有任何关系。如果你愿意,你可以将你的 virtualenv 存储在一个名为 ~/environments/my_env 的目录中,以及在 ~/projects/my_proj 中使用你的 virtualenv 时编写的所有源代码。

您可以在文档中阅读更多关于virtulenv的功能。

真的,唯一告诉 python 在哪里可以找到模块的东西完全基于 python(请参阅文档了解它的工作原理)。激活 virtualenv 会改变 python 的工作方式。

您可以返回让 shell 脚本为您激活 virtualenv,或者您可以按照这个秘籍直接从您的脚本中激活它。

activate_this = '/path/to/env/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))

如果您选择此路线,请记住文档提供的信息:

这将更改 sys.path 甚至更改 sys.prefix,但也允许您使用现有的解释器。您环境中的项目将首先显示在 sys.path 上,然后是全局项目。但是,全局项目将始终可访问(就好像 --system-site-packages 标志已用于创建环境,无论是否使用)。此外,这无法撤消其他环境或已导入模块的激活。例如,您不应该尝试在 Web 请求之前激活环境;您应该尽早激活一个环境,并且不要在该过程中再次激活。

于 2012-08-15T01:52:49.200 回答
3

你不能只添加一个相对路径吗?这对我有用:

#!./env/bin/python
于 2016-04-16T22:49:30.273 回答
0

我遇到了同样的问题并想出了这个解决方案:https ://github.com/jabbalaci/wpython 。这是一个名为 " wpython" 的脚本,它使用 venv 中的本地 Python 解释器调用您的程序。因此,不要写“” /Users/foo/environments/project/env/bin/python myscript.py,写“”就足够了wpython /path/to/myscript.py。启动器脚本可能如下所示:

#!/usr/bin/env bash

cd /the/directory/where/myscript.py/is/located
wpython myscript.py
于 2014-11-24T05:44:26.897 回答
0

如果您使用的是 windows,您可以在 python 文件的顶部包含以下行。

#! P:\Workspace\pythontut\Scripts python
于 2017-01-28T14:39:10.267 回答