【问题标题】:Activating virtualenv from within Python script从 Python 脚本中激活 virtualenv
【发布时间】:2019-01-29 11:54:13
【问题描述】:

我正在尝试使用以下 python 代码激活我的 virtualenv(已经存在):

Test.py

import os, sys
filename = "activate"
exec(compile(open(filename, "rb").read(), filename, 'exec'), globals, locals)
print(os.system('pwd'))

if hasattr(sys, 'real_prefix'):
    print('success')
else:
    print('failed')

然后我通过终端运行这个脚本:

python Test.py

然后产生此错误:

Traceback (most recent call last): File "activate_this.py", line 3, in <module> exec(compile(open(filename, "rb").read(), filename, 'exec'), globals, locals) File "activate", line 4 deactivate () { ^ SyntaxError: invalid syntax


我可以通过执行cd env/bin然后source activate成功激活virtualenv


TLDR

从 python 脚本激活 virtualenv 会在激活文件中引发语法错误。

【问题讨论】:

  • 为什么不正确执行此操作并从 shell 脚本激活它,然后在其中运行您的 python?更不用说activate 是一个sh 脚本,所以不确定你打算如何用python 执行它
  • ^^ 不知何故,我非常怀疑,在我所有的工作经验中,我从未见过以这种方式完成过一次,通常你制作一个 sh 脚本来激活你的环境然后运行你的 python 程序
  • 你不能compile()一个shell脚本...
  • 你为什么要在 bash 脚本上使用编译(激活)?除此之外,激活更改当前环境的环境变量以设置请求的 python 可执行文件和路径 - 从(另一个?) python 可执行文件(even if it works)运行它似乎完全没有意义 - 你为什么要这样做?

标签: python python-3.x ubuntu syntax-error virtualenv


【解决方案1】:

activate 的第 1st 行(注意 VEnv 安装在 Win 上,但这应该没问题):

# This file must be used with "source bin/activate" *from bash* 

那,下面的行应该告诉你 activate 是一个 (Bourne) shell 文件。

另一方面,

[Python 3]: compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1)Python 源代码一起使用。

因此,为了执行文件,您需要使用其他方式,例如[Python 3]: subprocess - Subprocess management
您可以查看我的使用方法:[SO]: How to effectively convert a POSIX path to Windows path with Python in Cygwin? (@CristiFati's answer)

但是,我真的不明白做这一切的意义,你可能误解了你同事的建议。
另请注意,即使您确实设法这样做了,所有环境变量只会在调用进程中设置,因此它几乎无法使用(好吧,除非您还执行脚本也从那里)。

您应该采用推荐的方式 ([PyPA]: Virtualenv - User Guide),即(来自 bash):

source /path/to/Django/ENV/bin/activate
python your_project_startup_script.py  # (as I recall, it's manage.py)

【讨论】:

  • 我将通过 bash 脚本完成所有操作,因为这是最合乎逻辑的方式
  • 是的,没有理由不采用推荐的方式,除非施加了一些限制。
猜你喜欢
  • 2018-08-02
  • 1970-01-01
  • 2011-10-20
  • 2017-12-18
  • 2020-01-16
  • 2018-05-05
  • 2015-09-04
  • 1970-01-01
相关资源
最近更新 更多