Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从virtualenv bin内部运行python脚本不起作用_Python_Virtualenv_Rundeck - Fatal编程技术网

从virtualenv bin内部运行python脚本不起作用

从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 ~

我有一个脚本,我想全球可用。我从标准的hashbang开始:

#! /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中评估脚本的效果时,将执行源脚本。