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

2024-05-13 17:25:09 发布

您现在位置:Python中文网/ 问答频道 /正文

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

#! /usr/bin/env python

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

~/environments/project/env/bin/myscript

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

myscript

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

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

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

以前,我使用的脚本激活了环境,然后运行我的脚本,但我的印象是,从这个文件夹运行的脚本应该与virtualenv的解释程序和站点包一起运行。你知道为什么这不起作用吗?或者我可以用一些方法调试它?


Tags: 路径目录envproject脚本文件夹标准bin
3条回答

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

#!./env/bin/python

我想你对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))

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

This will change sys.path and even change sys.prefix, but also allow you to use an existing interpreter. Items in your environment will show up first on sys.path, before global items. However, global items will always be accessible (as if the --system-site-packages flag had been used in creating the environment, whether it was or not). Also, this cannot undo the activation of other environments, or modules that have been imported. You shouldn’t try to, for instance, activate an environment before a web request; you should activate one environment as early as possible, and not do it again in that process.

将脚本放入virtualenv的bin中,然后将该bin位置添加到全局路径将不会自动获取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脚本。

相关问题 更多 >