我正在使用远程Python解释器(使用pew创建的虚拟环境),我通过ssh访问。当手动ssh到服务器并使用解释器时,这工作正常。但是当使用PyCharm来调用它时,它会忘记我在.bashrc中导出的环境变量。
似乎在通过ssh调用Python解释器时,PyCharm(尽管从bash开始)忽略了.bashrc。 Here表明shell包装器是解决方案。
#!/bin/bash -l
/path/to/interpreter/bin/python
但是简单地给PyCharm这个shell文件作为解释器不起作用(禁用包管理,当运行py-code时,Python终端打开......)。
如何获得一个“shell wrapper”,确保在运行PyCharm远程Python解释器之前执行.bashrc?
我确保PyCharm在正确的环境中运行。所有本地解释器都没有显示该问题(在PyCharm终端和Python脚本中进行测试:)
import os
print(os.environ)
我也知道运行特定文件的“编辑配置”选项以及在那里设置环境变量的可能性,但是对于每个项目/文件而言,这都是乏味的,而不是我正在寻找的。 p >
答案 0 :(得分:1)
我也一直在使用问题中提供的link中的解决方案,但有两个修改:
.profile
代替.bashrc
我的.bashrc
包含的命令使在交互式Shell中的工作更加轻松(设置别名,激活虚拟环境)。在.profile
中,我具有交互式和非交互式Shell都需要的命令,例如,设置重要库的路径。
我为远程Python解释器提供了.profile
而不是.bashrc
的源代码,以避免不必要的混乱环境,并确保与在非交互式(登录)shell中调用python
的设置相同
此外,您指定为远程解释器的外壳程序包装必须保持沉默。如果您获取.bashrc
的源代码,并且其中包含打印诸如"Activated my_conda_env"
之类的消息的命令,则会与PyCharm的远程调试器混为一谈。
python3.x
PyCharm的远程解释器和远程调试器不需要Shell包装器具有特定名称。但是,我观察到其他功能(例如PyCharm的打包工具(pip等))期望解释器具有标准名称(python
,python3
或python3.6
)。因此,我需要用外壳包装程序本身来代替python3.6
命令。
这样做的好处是,登录到远程服务器并在其中调用python
还将执行包装程序。因此,该行为与通过本地计算机上的PyCharm调用行为相同。
最终解决方案如下:
在虚拟环境/ conda环境的bin
目录中:
$ mv python3.6 python3.6_original
$ touch python3.6
$ chmod +x python3.6
在python3.6
中:
#!/bin/bash
# Make sure that the profile was sourced, so that executing python
# via ssh does the same as executing python locally.
if ! (( $PROFILE_SOURCED )); then
. ~/.profile
fi
# Get the directory of this script, see
# https://stackoverflow.com/a/53122736/2305095
__dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# Execute the original python.
${__dir}/python3.6_original "$@"
在.profile
的末尾:
export PROFILE_SOURCED=1
python
和python3
是默认情况下指向python3.6
的符号链接,因此它们自动指向外壳程序包装。
如果您使用的是conda,还应该检查python3.6
是否已经.bashrc
来源。 conda更新.bashrc
中的PATH(并建议您将其保留在此)。对于远程Python解释器,您可能还希望以相同的方式在python3.6
中更新PATH,并包括指向相关bin
目录的路径(例如,全局condabin
和相应环境的路径)。 bin
目录。
我已经使用此解决方案已有6个月了,到目前为止对此感到满意。让我知道您是否遇到任何问题!
答案 1 :(得分:0)
您希望您的包装器包含" $ @"在你的包装器中调用python时:
#!/bin/bash -l
/path/to/interpreter/bin/python "$@"
通过这个技巧,我设法在Windows上设置pycharm,同时在WSL(Ubuntu bash)中使用virtualenv并检索我的WSL env变量。
答案 2 :(得分:0)
尝试一下,可能会起作用。 右上角->编辑配置->环境变量->添加变量