为什么我的Pycharm执行代码时环境变量不一样?

问题描述 投票:0回答:2

环境:

Mac 操作系统 Catalina 10.15.7

Python 3.7.13

问题:

我的Python代码需要执行一些终端命令。但我收到错误消息:“找不到命令”。

所以我从“终端”测试了这些相同的命令,它运行得很好。

因此,我比较了终端加载的环境变量和 python 脚本加载的环境变量。结果是它们不一样。

您可以在这里看到我的 .zshrc 文件的内容:

export PATH="/Library/Java/JavaVirtualMachines/jdk1.8.0_271.jdk/Contents/Home:/Users/alisa/Android/cmdline-tools/latest/bin:/Users/alisa/Android/platform-tools:/bin:/opt/local/bin:/sbin:/usr/local/bin:/usr/sbin/:/usr/bin:/usr/local/opt/qt@/bin/:/usr/local/opt/qt@6/bin/:/Users/alisa/.wdm/drivers/geckodriver/macos/v0.30.0:/Library/Java/JavaVirtualMachines/jdk-15.0.2.jdk/Contents/Home:/usr/local/Cellar/[email protected]/:/usr/local/Cellar/[email protected]/3.9.12_1/bin/:/usr/local/lib/python3.9/site-packages:/usr/local/Cellar/[email protected]/3.9.12_1/Frameworks/Python.framework/Versions/3.9/bin/"
export ANDROID_HOME="/Users/alisa/Android"
export JAVA_HOME="/Library/Java/JavaVirtualMachines/jdk-15.0.2.jdk/Contents/Home"
DYLD_LIBRARY_PATH="/usr/local/lib/python3.9/site-packages/PySide2:/usr/local/lib/python3.9/site-packages/PyQt5/:/Library/Java/JavaVirtualMachines/jdk-15.0.2.jdk/Contents/Home"
export DYLD_LIBRARY_PATH
export DYLD_PRINT_LIBRARIES=1
set QT_DEBUG_PLUGINS=1
export REQUESTS_CA_BUNDLE="$HOME/.mac-ca-roots"
export LDFLAGS="-L$(brew --prefix xz)/lib -L$(brew --prefix readline)/lib -L$(brew --prefix zlib)/lib"
export CPPFLAGS="-I$(brew --prefix xz)/include -I$(brew --prefix readline)/include -I$(brew --prefix zlib)/include -I$(xcrun --show-sdk-path)/usr/include"
alias python3=/usr/local/opt/[email protected]/bin/python3
APPDATA="/users/alisa"
export APPDATA

TESSDATA_PREFIX="/opt/local/share/tessdata"
export TESSDATA_PREFIX
export PATH="/usr/local/sbin:$PATH"
alias python3="/usr/local/Cellar/[email protected]/3.9.12_1/Frameworks/Python.framework/Versions/3.9/bin/python3.9"
export PYTHONPATH=/usr/local/lib/python3.9/site-packages/

这里是用我的 python 代码加载的环境变量的值:

HOME:/Users/alisa
LC_CTYPE:en_GB.UTF-8
LD_LIBRARY_PATH:/usr/local/Cellar/opencv/4.5.5_2/lib/python3.9/site-packages/cv2/../../../../lib:
LOGNAME:alisa
PATH:/usr/bin:/bin:/usr/sbin:/sbin
PWD:/Volumes/GoogleDrive/My Drive/Phonebot/Phonebot_debug3
PYCHARM_HOSTED:1
PYTHONIOENCODING:UTF-8
PYTHONPATH:/Volumes/GoogleDrive/My Drive/Phonebot/Phonebot_debug3
PYTHONUNBUFFERED:1
SHELL:/bin/zsh
SSH_AUTH_SOCK:/private/tmp/com.apple.launchd.OJCYKYn5oR/Listeners
TMPDIR:/var/folders/gg/d60v4x454xd_n7dzwkv_y9140000gn/T/
USER:alisa
XPC_FLAGS:0x0
XPC_SERVICE_NAME:com.jetbrains.pycharm.20596
__CF_USER_TEXT_ENCODING:0x1F5:0x0:0x2

您可以看到 PATH 不一样,这就是为什么我收到错误“找不到命令”。

这是我用来显示环境变量的Python代码:

def GetEnvVariables():
    dico_env={}

    for k, v in sorted(os.environ.items()):
        #print(k+':', v)
        dico_env[k]=v
    print(f"dico_env:{dico_env}")
    return dico_env

dico=mymodules.GetEnvVariables()
for key, value in dico.items():
    print('%s:%s\n' % (key, value))

我也尝试过这个命令:

print(os.environ.get('PATH'))

这是输出:

/usr/bin:/bin:/usr/sbin:/sbin

同样,PATH 值与我的 .zshrc 文件不同

我正在使用 pycharm 来执行我的 Python 代码。所以我从终端运行我的代码,这次它成功了! 我停止并重新启动 Pycharm,但仍然遇到同样的问题。

有谁知道如何修改 Pycharm 以考虑我所有的环境变量?

谢谢

python python-3.x pycharm environment-variables
2个回答
1
投票

请使用

.zshenv
并确保重新启动 PyCharm。适用于 PyCharm 2022.2.3 Professional。


0
投票

在这里发布这个解决方案和解释,因为我刚刚花了一整天的时间解决这个问题。

为什么 PyCharm 与 zsh 中的环境变量可能不同

当您的终端应用程序启动时,它会读取并处理许多 zsh 配置,并在此过程中获取环境变量(

PATH
,尤其是其中)。

当您从 Finder 或 Launchpad、Dock 或其他地方启动应用程序时,它会使用

launchd
(pid 1) 启动它。启动的进程实际上继承了调用它的进程的环境。这些进程不是 zsh,并且没有在常用 shell 中设置所有环境变量。

如果您运行

open /Applications/PyCharm.app
(或您的 PyCharm 应用程序所在的任何位置),您将通过 launchd 启动该应用程序,但您将在完整的 zsh 环境中从进程中完成此操作。魔法!您的环境变量出现。

使其永久化

当我从终端启动 PyCharm 时(使用

open
),后续从 Dock 或 Spotlight 启动实际上使用我在 zsh 中获得的相同环境变量打开它。显然,这是由于跨会话缓存所致。

为了使更改永久生效,您可以使用

launchctl setenv <variable> <value>
命令。在终端中以普通用户身份运行它将会配置 launchd。

如果您想更改为所有用户配置的 PATH 变量,只需将包含路径的文件(每行一个)添加到

/etc/paths.d
。例如:
sudo echo "/opt/homebrew/bin\n/opt/homebrew/sbin" > /etc/paths.d/homebrew
。我相信您需要重新启动才能生效。

希望这可以帮助人们比我花更少的时间来解决这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.