V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
brq417059
V2EX  ›  Python

求教大家 pycharm 中,环境变量 path 的问题!

  •  1
     
  •   brq417059 · 2017-04-15 17:10:35 +08:00 · 12877 次点击
    这是一个创建于 1647 天前的主题,其中的信息可能已经有所发展或是发生改变。

    问题的发现

    在 pycharm 里把一个编译好的二进制文件放到/usr/local/bin/,然后在程序里调用。

    cmmd = "xxx ..."
    os.system(cmmd)
    

    报这样的错,但是/usr/local/bin/已经在环境变量 path 里。

    sh: xxx: command not found
    

    最简单的解决办法就是把上述命令改为:

    cmmd = "/usr/local/bin/xxx ..."
    

    但是仍然想知道原因。

    问题分析

    这是用print(os.environ)在 pycharm 里打印出来的信息( pycharm 里用的 pyenv 创建的虚拟环境)

    environ({......, 'PATH': '/Users/xxx/.pyenv/versions/3.6.0/envs/test-3.6.0/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/baoruiqi/.pyenv/versions/test-3.6.0/bin', 'PYENV_SHELL': 'fish', ......})
    

    打印出几乎是所有的环境变量(包括各种和 python 无关的)。这里的 PATH 和在 shell 里执行echo $PATH得到的结果不一样,头尾都加上了当前虚拟环境的路径(为啥要加两次?可能是 pyenv 的手段),另外中间去掉了很多环境值,包括这次踩到的坑/usr/local/bin

    为了探索原因,我在 shell 里先进 pycharm 里使用的同一个 python 虚拟环境,再打印值:

    $ pyenv activate test-3.6.0
    (test-3.6.0) $ python
    >>> import os
    >>> os.environ
    
    environ({......, 'PATH': '/Users/baoruiqi/.pyenv/versions/test-3.6.0/bin:/usr/local/Cellar/pyenv/1.0.10/libexec:/usr/local/Cellar/pyenv-virtualenv/1.0.0/shims:/Users/baoruiqi/.pyenv/shims:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin', .......})
    

    打印出来的命令依然是经过一些添加的命令,但是基本涵盖真实 PATH 中的值

    这样来看是不是意味着:虽然 python 本身会根据当前环境修改出自身( python shell )的变量,但是我这个坑的罪魁祸首是 pycharm 呢?但是 pycharm 的偏好设置里没有找到环境变量相关设置。

    7 条回复    2021-04-01 22:26:50 +08:00
    brq417059
        1
    brq417059   2017-04-15 18:13:36 +08:00
    吃了个饭回来,自己顶一下
    zsz
        2
    zsz   2017-04-15 19:29:00 +08:00 via iPhone
    pycharm 的进程是桌面环境的子进程,终端启动的时候才会读取 .bashrc ,你的环境变量不是配置在系统级别,所以 pycharm 看不到这个环境变量


    看 pycharm 隶属的进程树分析下就能看出原因了
    frinstioAKL
        3
    frinstioAKL   2017-04-15 20:04:16 +08:00
    没细看你的帖子,说一下 pycharm 改环境变量的地方,最近折腾远程 ssh 调用 GPU 跑深度学习这一块,倒腾了好久。也许对你有帮助
    1. Preference -> Build, Execution, Deployment -> Console -> Python Console 下最上面可设置环境变量
    2. 任务栏顶部的 Run -> Edit Configurations 里面有个 Environment Variables
    首先我在 1 中设置了远端 GPU 服务器的环境变量,点击 run 后居然提示 cuDNN 打不开, LD_LIBRARY_PATH 环境变量不对,但是用 os.environ 打印出来发现并没有问题。后来在 2 中设置了一下就好了,我也很迷,感觉莫名其妙
    rogerchen
        4
    rogerchen   2017-04-15 21:51:24 +08:00 via Android
    每一个 run 都可以单独设置环境变量啊
    nicevar
        5
    nicevar   2017-04-16 14:18:09 +08:00
    看到 Cellar 楼主用的应该是 mac ,我觉得这个坑的罪魁祸首不是 pycharm ,应该是你自己,我估计是你某个地方配置造成的,可以做简单的测试,.bash_profile 最简化及切换 pycharm 的 Project Interpreter 进行测试
    brq417059
        6
    brq417059   2017-04-17 00:11:18 +08:00
    @nicevar 在 youtrack 上发帖子时候,提示有相似问题的帖子。然后就找到了 https://youtrack.jetbrains.com/issue/PY-17816

    的确是 pycharm 的问题。不知道啥时候能修复
    ChineseOldSober
        7
    ChineseOldSober   200 天前
    今天遇到此问题了,写下回答留给未来浏览的网友去看。
    粗暴解法:只需要带着指令的详细路径运行就可以了。
    例如你的命令是 java xxx,那么你就先去 bash 里手查一下 java 的详细路径,
    查一下:whereis java,比如得到了 /usr/local/jdk-11.0.7/bin/java
    然后你就把 cmd 改成 ”/usr/local/jdk-11.0.7/bin/java xxxx"就可以了。根本原因是 pycharm 运行时候不读 bashrc 环境变量,就找不到 java,你自己指定就可以了。
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4470 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 02:06 · PVG 10:06 · LAX 19:06 · JFK 22:06
    ♥ Do have faith in what you're doing.