我有一个脚本,我想在全球可用。我是从标准的hashbang开始的:
#! /usr/bin/env python
并将其链接到我的virtualenv的bin目录中:
~/environments/project/env/bin/myscript
并将该目录添加到我的路径中。当我运行命令时:
myscript
其中一个库出现导入错误。但是,如果我激活虚拟环境并运行脚本,它将按预期工作。
我已经排除了symlink的问题(我也尝试过将脚本移动到bin文件夹中)。我也试过用python运行脚本
python ~/environments/project/env/bin/myscript
以前,我使用的脚本激活了环境,然后运行我的脚本,但我的印象是,从这个文件夹运行的脚本应该与virtualenv的解释程序和站点包一起运行。你知道为什么这不起作用吗?或者我可以用一些方法调试它?
你不能加一个相对路径吗?这对我有效:
我想你对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直接从脚本激活它。
如果您选择此路线,请记住文档提供的信息:
将脚本放入virtualenv的bin中,然后将该bin位置添加到全局路径将不会自动获取virtualenv的源代码。你需要先找到它的来源才能激活它。
您的系统只知道检查可执行文件的额外路径并运行它。脚本中没有任何内容表示virtualenv。
但是,您可以将she-bang行硬编码到virtualenv python中,在这种情况下,站点包最终将位于以下路径:
或者另一个选择是简单地创建一个调用原始pythons脚本的小bash包装器,这将允许您在原始脚本中留下一个通用的she-bang。。
所以如果myscript.py是:
#!/usr/bin/env python
。。。然后你可以做一个
myscript
:当您执行
myscript
时,它将使用您设置的解释器显式调用您的python脚本。相关问题 更多 >
编程相关推荐