我有一个我希望全球可用的脚本。我用标准的hashbang开始了它:
#! /usr/bin/env python
并将其链接到我的virtualenv的bin目录中:
~/environments/project/env/bin/myscript
并将该目录添加到我的路径中。当我运行命令时:
myscript
我的其中一个库出现导入错误。但是,如果我激活虚拟环境并运行脚本,它将按预期工作。
我已经排除了符号链接的问题(我也试过在bin文件夹中移动脚本)。我也尝试用python运行脚本
python ~/environments/project/env/bin/myscript
以前我使用的是激活环境然后运行我的脚本的脚本,但我认为从这个文件夹运行的脚本应该与virtualenv的解释器和site-packages一起运行。任何关于为什么这可能不起作用的想法或某些方法我可以调试它?
答案 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