繁体   English   中英

venv 和 REPL 中的 Python 脚本拉入不同的环境变量

[英]Python script inside venv and REPL pulling in different environment variables

我在 Python 3 venv 内的bin/activate中添加了以下行。

export RAIN_ENV="dev"

我激活了 venv,然后启动了 REPL,可以看到RAIN_ENV ...

source /var/www/rain/bin/activate
(rain) crmpicco/var/www/rain(master|✚1) % python
Python 3.9.10 (main, Jan 15 2022, 11:48:04) 
[Clang 13.0.0 (clang-1300.0.29.3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> print(os.environ)
environ({'__CFBundleIdentifier': 'com.apple.Terminal', 'TERM_PROGRAM_VERSION': '445', 'TERM_SESSION_ID': '12033E65-4D4B-4C11-8471-2708CFC4F550', 'SHELL': '/bin/zsh', 'PATH': '/var/www/rain/bin:/usr/local/opt/php@7.4/sbin:/usr/local/opt/php@7.4/bin:/Users/crm/.yarn/bin:/Users/crm/.config/yarn/global/node_modules/.bin:/Library/Frameworks/Python.framework/Versions/2.7/bin:/usr/local/opt/postgresql@12/bin:/Library/Frameworks/Python.framework/Versions/2.7/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin', 'SHLVL': '1', 'PWD': '/var/www/rain', 'OLDPWD': '/var/www/rain/rain', 'LIBRESSL_REDIRECT_STUB_ABORT': '0', 'EDITOR': '/usr/bin/vim', '__GIT_PROMPT_DIR': '/Users/crm/zsh-git-prompt', 'GIT_PROMPT_EXECUTABLE': 'python',  'PS1': '(rain) %B%m%~%b$(git_super_status) %# ', 'RAIN_ENV': 'dev', 'VIRTUAL_ENV': '/var/www/rain', 'LANG': 'en_AU.UTF-8', '_': '/var/www/rain/bin/python'})
>>> 

但是,当我在 venv 中启动 Python 3 应用程序时,代码会返回一组完全不同的环境变量:

(rain) crmpicco/var/www/rain(master|✚1) % sudo python main.py         
Password:
env vars
environ({'TERM': 'xterm-256color', 'SSH_AUTH_SOCK': '/private/tmp/com.apple.launchd.rny3w7r22E/Listeners', 'HOME': '/Users/crm', 'PATH': '/var/www/rain/bin:/usr/local/opt/php@7.4/sbin:/usr/local/opt/php@7.4/bin:/Users/crm/.yarn/bin:/Users/crm/.config/yarn/global/node_modules/.bin:/Library/Frameworks/Python.framework/Versions/2.7/bin:/usr/local/opt/postgresql@12/bin:/Library/Frameworks/Python.framework/Versions/2.7/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin', 'EDITOR': '/usr/bin/vim', 'PS1': '(rain) %B%m%~%b$(git_super_status) %# ', 'LANG': 'en_AU.UTF-8', 'MAIL': '/var/mail/root', 'LOGNAME': 'root', 'USER': 'root', 'SHELL': '/bin/sh', 'SUDO_COMMAND': '/var/www/rain/bin/python main.py --env=dev', 'SUDO_USER': 'crm', 'SUDO_UID': '502', 'SUDO_GID': '20', '__CF_USER_TEXT_ENCODING': '0x0:0:15'})

output 有print(os.environ)的结果

如何从 venv 中提取变量?

(rain) crmpicco/var/www/rain(master|✚2) % which python
/var/www/rain/bin/python

当您使用sudo时,它会在不同环境中以不同用户身份运行命令 - 没有venv ,使用标准 python。

您可能需要运行which python以在活动venv中获取/full/path/to/python并稍后使用

sudo /full/path/to/python main.py

它可能还需要使用选项--preserve-env ( -E ) 运行sudo才能访问RAIN_ENV="dev"和原始环境中的所有其他设置

sudo -E /full/path/to/python main.py

或更短(在bash中,可能在zsh和最新的fish中)

sudo -E $(which python) main.py

您可以使用sudo -E env测试环境

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM