jus*_*tin 28 python virtualenv rundeck
我有一个我希望全球可用的脚本.我用标准的hashbang开始了它:
#! /usr/bin/env python
Run Code Online (Sandbox Code Playgroud)
并将其链接到我的virtualenv的bin目录:
~/environments/project/env/bin/myscript
Run Code Online (Sandbox Code Playgroud)
并将该目录添加到我的路径中.当我运行命令时:
myscript
Run Code Online (Sandbox Code Playgroud)
我的其中一个库出现导入错误.但是,如果我激活虚拟环境并运行脚本,它将按预期工作.
我已经排除了符号链接的问题(我也试过在bin文件夹中移动脚本).我也尝试用python运行脚本
python ~/environments/project/env/bin/myscript
Run Code Online (Sandbox Code Playgroud)
以前我使用的是激活环境然后运行我的脚本的脚本,但我觉得从这个文件夹运行的脚本应该与virtualenv的解释器和site-packages一起运行.任何关于为什么这可能不起作用的想法或某些方法我可以调试这个?
jdi*_*jdi 47
将脚本放入virtualenv的bin中,然后将该bin位置添加到全局PATH将不会自动获取virtualenv.您需要首先获取它以使其处于活动状态.
您的系统知道的所有内容都是检查可执行文件的额外路径并运行它.该脚本中没有任何内容表明virtualenv.
但是,您可以将she-bang行硬编码到virtualenv python中,在这种情况下,站点包将最终在路径上:
#!/Users/foo/environments/project/env/bin/python
Run Code Online (Sandbox Code Playgroud)
或者另一种选择是简单地创建一个微小的bash包装器,调用你原来的pythons脚本,这将允许你保留原始脚本与通用的she-bang ..
所以如果myscript.py是: #!/usr/bin/env python...
然后你可以做一个myscript:
#!/bin/bash
/Users/foo/environments/project/env/bin/python myscript.py
Run Code Online (Sandbox Code Playgroud)
当你这样做时myscript,它将使用你设置的解释器显式调用你的python脚本.
Mar*_*eth 11
我认为你对virtualenv的工作原理感到困惑.
简而言之,virtualenv会修改您的shell环境,以便Python在不同区域查找您要导入的模块.存储虚拟环境的位置与存储在virtualenv中运行的源文件的位置之间没有任何关系.如果您愿意,可以将virtualenv存储在名为〜/ environments/my_env的目录中,以及在〜/ projects/my_proj中使用virtualenv时编码的所有源代码.
您可以阅读更多关于virtulenv在文档中的作用.
真的,唯一告诉python在哪里找到模块的东西完全基于python(参见文档如何工作).激活virtualenv会改变python的工作方式.
您可以返回让shell脚本为您激活virtualenv,或者您可以按照此配方直接从脚本激活它.
activate_this = '/path/to/env/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))
Run Code Online (Sandbox Code Playgroud)
如果您选择此路线,请记住文档提供的信息:
这将更改sys.path甚至更改sys.prefix,但也允许您使用现有的解释器.环境中的项目将首先显示在sys.path上,然后显示在全局项目之前.但是,始终可以访问全局项(就像在创建环境时使用了--system-site-packages标志一样,无论是否存在).此外,这无法撤消其他环境或已导入模块的激活.例如,您不应该尝试在Web请求之前激活环境; 您应该尽早激活一个环境,而不是在该过程中再次激活.
| 归档时间: |
|
| 查看次数: |
69246 次 |
| 最近记录: |