如何用Python指定脚本中模块执行时的virtualenv环境?

假设有一个 example.sh 文件,里面有一行‘ flask run ’,并且指定了 FLASK_APP。该文件用于启动运行 flask 项目,但终端执行’ sh example.sh’时,即使激活了 virtualenv,项目的运行环境还是系统默认的 python 环境,请问如何指定为特定的 virtualenv ?
如何用Python指定脚本中模块执行时的virtualenv环境?

11 回复

一般不是 env/bin/python app.py 么?


在Python脚本中直接指定virtualenv环境,最可靠的方式是在脚本开头通过shebang行指定解释器路径。

假设你的virtualenv路径是 /path/to/your/venv,可以这样写脚本:

#!/path/to/your/venv/bin/python

import sys
import os

def main():
    # 验证是否在正确的虚拟环境中
    if hasattr(sys, 'real_prefix') or (hasattr(sys, 'base_prefix') and sys.base_prefix != sys.prefix):
        print(f"Running in virtual environment: {sys.prefix}")
    else:
        print("Not running in a virtual environment")
    
    # 你的业务代码
    print("Hello from virtualenv!")

if __name__ == "__main__":
    main()

关键点:

  1. 第一行shebang#!/path/to/your/venv/bin/python 直接指定了虚拟环境中的Python解释器
  2. 权限设置:需要给脚本添加执行权限:chmod +x your_script.py
  3. 执行方式:直接运行 ./your_script.py 而不是 python your_script.py

另一种方法是在脚本中动态修改环境,但不推荐,因为可能影响后续导入:

import sys
import os

# 设置虚拟环境的site-packages路径
venv_path = "/path/to/your/venv"
site_packages = os.path.join(venv_path, "lib", f"python{sys.version_info.major}.{sys.version_info.minor}", "site-packages")
sys.path.insert(0, site_packages)

# 现在可以导入虚拟环境中的包了

总结:用shebang行指定解释器路径是最干净的方法。

在脚本里加 active 啊,还能怎么办 - -|||

不用激活 venv。直接指定 venv 所在 python 路径即可。

比如 source /my_path/venv/bin/activate; python xxx.py 改为:

/my_path/venv/bin/python xxx.py 即可。自动 venv 了。

难道不是写解释器的绝对路径就可以了吗

在脚本中 source 激活 virtualenv 就行,一直在终端激活,谢谢!


这样也行。由于整个项目都要在指定环境下运行,所以就直接在脚本中增加一行‘ source venv/bin/activate ’

运行的时候把配置相关的事情都丢给 uwgi 之类的服务嘛

不需要 activate
直接用 virtualenv “里面”的 python 来执行就可以了
( scl/pyenv 除外)

$YOUR_PAROJECT_PATH/venv/bin/python app.py

回到顶部