从virtualenv bin内部运行python脚本不起作用
我有一个脚本,我想全球可用。我从标准的hashbang开始:从virtualenv bin内部运行python脚本不起作用,python,virtualenv,rundeck,Python,Virtualenv,Rundeck,我有一个脚本,我想全球可用。我从标准的hashbang开始: #! /usr/bin/env python 并将其链接到我的virtualenv的bin目录: ~/environments/project/env/bin/myscript 并将该目录添加到我的路径中。当我运行命令时: myscript 其中一个库出现导入错误。但是,如果激活虚拟环境并运行脚本,它将按预期工作 我已经排除了符号链接的问题(我还尝试将脚本移动到bin文件夹中)。我还尝试使用python运行脚本 python ~
#! /usr/bin/env python
并将其链接到我的virtualenv的bin目录:
~/environments/project/env/bin/myscript
并将该目录添加到我的路径中。当我运行命令时:
myscript
其中一个库出现导入错误。但是,如果激活虚拟环境并运行脚本,它将按预期工作
我已经排除了符号链接的问题(我还尝试将脚本移动到bin文件夹中)。我还尝试使用python运行脚本
python ~/environments/project/env/bin/myscript
以前我使用的脚本激活了环境,然后运行我的脚本,但我的印象是,从这个文件夹运行的脚本应该与virtualenv的解释器和站点包一起运行。任何关于这可能不起作用的想法或我可以调试它的方法?将脚本放入virtualenv的bin,然后将bin位置添加到全局路径不会自动为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脚本。我想您对virtualenv的工作方式感到困惑 简而言之,virtualenv修改您的shell环境,以便Python可以在不同的区域查找您想要导入的模块。存储虚拟环境的位置与存储在VirtualEnvironment中运行的源文件的位置之间实际上没有任何关系。如果您愿意,您可以将您的virtualenv存储在名为~/environments/my_env的目录中,以及在~/projects/my_proj中使用virtualenv时编写的所有源代码 您可以在文档中阅读更多信息 实际上,告诉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请求之前的环境;您应该激活一个环境
尽可能早,在这个过程中不要再这样做
我遇到了同样的问题,并提出了这个解决方案:。这是一个名为“
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
你不能只添加一个相对路径吗?这对我很有用:
#!./env/bin/python
在使用windows的情况下,可以在python文件的顶部包含以下行
#! P:\Workspace\pythontut\Scripts python
与您的问题无关:尽管大多数shell忽略了它,但使用
#/
严格来说是错误的,因为空间必须被视为程序路径的一部分。放下空间,你就安全了。谢谢,这就是我最初的脚本所做的。我记得看到过一些东西,我以为文件夹会激活环境,但你说得对,我认为这是不可能的。你不是必须找到myscript的来源,而不是简单地叫它的名字吗?@JoshUsre不,在这种情况下,myscript是一个引导程序,以特定的方式启动myscript.py。当您希望在当前shell中评估脚本的效果时,将执行源脚本。