如何用Python指定脚本中模块执行时的virtualenv环境?
假设有一个 example.sh 文件,里面有一行‘ flask run ’,并且指定了 FLASK_APP。该文件用于启动运行 flask 项目,但终端执行’ sh example.sh’时,即使激活了 virtualenv,项目的运行环境还是系统默认的 python 环境,请问如何指定为特定的 virtualenv ?
如何用Python指定脚本中模块执行时的virtualenv环境?
一般不是 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()
关键点:
- 第一行shebang:
#!/path/to/your/venv/bin/python直接指定了虚拟环境中的Python解释器 - 权限设置:需要给脚本添加执行权限:
chmod +x your_script.py - 执行方式:直接运行
./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 啊,还能怎么办 - -|||
难道不是写解释器的绝对路径就可以了吗
在脚本中 source 激活 virtualenv 就行,一直在终端激活,谢谢!
这样也行。由于整个项目都要在指定环境下运行,所以就直接在脚本中增加一行‘ source venv/bin/activate ’
运行的时候把配置相关的事情都丢给 uwgi 之类的服务嘛
不需要 activate
直接用 virtualenv “里面”的 python 来执行就可以了
( scl/pyenv 除外)
$YOUR_PAROJECT_PATH/venv/bin/python app.py
exec activate_this.py

