从virtualenv bin内部运行python脚本无效

时间:2012-08-15 01:33:49

标签: python virtualenv rundeck

我有一个我希望全球可用的脚本。我用标准的hashbang开始了它:

#! /usr/bin/env python

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

~/environments/project/env/bin/myscript

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

myscript

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

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

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

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

5 个答案:

答案 0 :(得分:42)

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

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

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

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

或者另一种选择是简单地创建一个小的bash包装器来调用你原来的pythons脚本,这样你就可以让你的原始脚本保留一般的she-bang ..

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

然后你可以制作myscript

#!/bin/bash

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

执行myscript时,它将使用您设置的解释器显式调用您的python脚本。

答案 1 :(得分:10)

我认为你对virtualenv的工作原理感到困惑。

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

您可以在文档中详细了解what virtulenv does

真的,唯一告诉python在哪里找到模块的东西完全基于python(see the docs关于它是如何工作的)。激活virtualenv会改变python的工作方式。

您可以返回让shell脚本为您激活virtualenv,或者您可以按照this recipe直接从脚本中激活它。

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请求之前的环境;你应该激活一个环境   尽早,而不是在那个过程中再做一次。

答案 2 :(得分:2)

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

(a) =>
{
    Invoke(new Action(() => button1.Text = someValue)); //marshal to UI thread
}

答案 3 :(得分: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

答案 4 :(得分:0)

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

#! P:\Workspace\pythontut\Scripts python