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
leonme
V2EX  ›  Python

请问如何判断启动某个 Python 进程的 Python 环境位置呢?

  •  
  •   leonme · 2020-11-14 16:33:59 +08:00 · 2648 次点击
    这是一个创建于 1465 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如基于系统 python3 创建了两个 python venv 环境:python3-venv-01, python3-venv-02,那么根据 python 服务的进程号如何查看是属于 python3-venv-01 还是 python3-venv-02 启动的呢?
    第 1 条附言  ·  2020-11-15 10:47:59 +08:00
    多谢 14 楼 @hasdream 老哥提供的方法,非常赞~~👍🏻
    第 2 条附言  ·  2020-11-15 16:28:27 +08:00
    也可按照 20 楼 @ClericPy 老哥提供的解决方式,具体见 21 楼
    23 条回复    2020-11-16 10:35:25 +08:00
    DarkCat123
        1
    DarkCat123  
       2020-11-14 16:46:03 +08:00
    lsof 或者 ls /proc ?
    leonme
        2
    leonme  
    OP
       2020-11-14 16:58:23 +08:00
    @DarkCat123 试过了,还是没找到~~老哥能具体指点下吗?
    hasdream
        3
    hasdream  
       2020-11-14 17:13:21 +08:00 via Android   ❤️ 2
    readlink /proc/pid/exe
    DarkCat123
        4
    DarkCat123  
       2020-11-14 17:23:12 +08:00
    @leonme 我对 python 不太熟。
    不过本质上来说这个还是看这玩意儿被软连接到哪个环境去了。
    所以通过 proc/{pid} 是可以看到里面的软连接情况,能看到到底是连接到哪里去了
    zooo
        5
    zooo  
       2020-11-14 19:54:12 +08:00
    提供个思路:在 python 中执行系统 shell which python 查看下下 python 执行路径,不同 python 保存的路径不同
    zach14c
        6
    zach14c  
       2020-11-14 20:13:49 +08:00
    sys.base_exec_prefix
    from python manual:
    >在 python 启动期间设置,在 site.py 运行,值与 exec_prefix . 如果不是在 virtual environment 值将保持不变;如果 site.py 查找正在使用的虚拟环境,值为 prefix 和 exec_prefix 将更改为指向虚拟环境,而 base_prefix 和 base_exec_prefix 将继续指向基本的 python 安装(从中创建虚拟环境的安装
    DoctorCat
        7
    DoctorCat  
       2020-11-14 21:22:17 +08:00
    X-Y problems
    为何一定通过进程号?一定这样?如果是解决你标题提到的问题,
    @zach14c 提供的方法是 ok 的
    leonme
        8
    leonme  
    OP
       2020-11-14 21:50:53 +08:00
    @DoctorCat 是这样的,目前服务器上 python venv 环境比较多,接手了别人的 python 项目,想快速确定是哪个 venv 启动的,查看一些依赖版本之类的~~
    leonme
        9
    leonme  
    OP
       2020-11-14 22:09:32 +08:00
    @hasdream 查看了下,这种方式获取的都是宿主机的 python 路径,也就是创建各种 venv 的 python 路径,不同 venv 环境启动的应用,exe 都是一样的
    leonme
        10
    leonme  
    OP
       2020-11-14 22:10:06 +08:00
    @zooo 可以在不更改代码的情况下的确定吗?
    leonme
        11
    leonme  
    OP
       2020-11-14 22:12:22 +08:00
    @zach14c 激活不同 venv 环境,print(sys.base_exec_prefix)都是一样的结果
    leonme
        12
    leonme  
    OP
       2020-11-14 22:13:38 +08:00
    @DoctorCat 试验了下上述的方法,不知是不是我理解有问题,似乎不太可行。激活不同 venv 环境,print(sys.base_exec_prefix)都是一样的结果
    zach14c
        13
    zach14c  
       2020-11-14 23:02:01 +08:00
    ~  source p3-2/bin/activate; echo -e "import sys\nprint(sys.exec_prefix)" | python;deactivate;
    /home/zach/p3-2
    ~  source myp3/bin/activate; echo -e "import sys\nprint(sys.exec_prefix)" | python;deactivate;
    /home/zach/myp3
    hasdream
        14
    hasdream  
       2020-11-15 00:26:34 +08:00 via Android   ❤️ 1
    strings /proc/pid/environ 看这个进程的环境变量 应该有这个进程是那个虚拟环境的
    kkbblzq
        15
    kkbblzq  
       2020-11-15 01:25:40 +08:00
    用 sys.executable 完事
    frostming
        16
    frostming  
       2020-11-15 08:17:28 +08:00
    ls -l /proc/<pid>/cmd
    leonme
        17
    leonme  
    OP
       2020-11-15 10:45:07 +08:00
    @hasdream 多谢老哥,很赞~~请教下这些东西是看哪些书了解到的呢?
    leonme
        18
    leonme  
    OP
       2020-11-15 10:45:46 +08:00
    @frostming 没看到有 cmd 这个文件
    leonme
        19
    leonme  
    OP
       2020-11-15 10:47:03 +08:00
    @kkbblzq 不改代码的情况下通过 python 进程的 pid 查找 python 路径哈
    ClericPy
        20
    ClericPy  
       2020-11-15 11:07:22 +08:00   ❤️ 1
    虽然你已经解决了, 顺嘴一提 psutil 的 cmdline 不知道能不能帮到你, 先通过 pid 拿到 Process 对象, 然后看它启动时候命令行参数里面的路径
    leonme
        21
    leonme  
    OP
       2020-11-15 16:27:03 +08:00
    @ClericPy 谢谢老哥,也是一种很优雅的解决方式

    import psutil
    pp = psutil.Process(16049)
    print(pp.cmdline())
    # 或者 print(pp.environ())

    供其他人参考
    hasdream
        22
    hasdream  
       2020-11-15 22:53:32 +08:00 via Android   ❤️ 1
    @leonme man proc
    frostming
        23
    frostming  
       2020-11-16 10:35:25 +08:00   ❤️ 1
    @leonme psutil 的东西也是从 /proc 下读的
    比如
    cat /proc/<pid>/cmdline
    cat /proc/<pid>/environ
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1037 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 19:46 · PVG 03:46 · LAX 11:46 · JFK 14:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.