【问题标题】:How to find out the Python library installation path?如何找出Python库的安装路径?
【发布时间】:2013-07-01 10:53:59
【问题描述】:

为了安装第三方 Python 包,我使用了一个 setup.py 脚本,该脚本使用 setuptools.setup() 来安装一堆包。安装后,我可以在 /usr/local/lib/python2.7/dist-packages 下的一台机器和 /usr/lib/python2.7/site-packages 下的另一台机器上找到这些包。

现在我想编写一个 Python 脚本来找出第三方软件包的安装位置。我该怎么做?

1) sys.prefix=sys.exec_prefix 在两台机器“/usr”上。

2) python 可执行文件在两台机器/usr/bin/python 上。

3) distutils.sysconfig.get_python_lib() 在一台机器上是 /usr/lib/python2.7/dist-packages (缺少“local”),在一台机器上是 /usr/lib/python2.7/site-packages其他机器。

【问题讨论】:

    标签: python setuptools library-path


    【解决方案1】:

    如果软件包已经安装,您可以直接导入它们,然后查看它们的__file__ 属性:

    >>> import mymodule
    >>> print mymodule.__file__
    '/path/to/mymodule.py'
    

    【讨论】:

    • 有趣的把戏。但是不能使用,如果不同主机上安装的包不同,不知道某个模块是否安装在某个主机上。
    • 这对我的答案很有用。
    • 如果你一开始就不能导入包怎么办?
    • 我喜欢这个解决方案。 ObUpdate — 在 plaid3 中是 print(mymodule.__file__)
    【解决方案2】:

    几乎找到了解决此问题的方法。我参考了this questionthis question 所以感谢那里给出的答案。

    首先,您需要将所有已安装模块的列表放入列表中。使用this question 捕获solution to this question 的输出。

    现在您有了所有已安装的 python 模块的列表。您将需要查看列表的格式,然后对其进行正确格式化以获取各个元素作为模块的名称。

    然后您可以按照here 的说明将模块名称作为字符串导入。然后正如 alejandro 已经说过的,mymodule.__file__ 包含路径。

    这是一种应该可行的解决方案。不是很优雅,但我只是一个 Python 初学者,比 Python 更擅长 google 搜索


    我找到了一种更简单的方法来查找模块的位置。这可能是 OP 正在寻找的“优雅”解决方案。
    import sys
    print sys.path
    

    来自关于 sys module sys.path 的 Python 文档包含

    指定模块搜索路径的字符串列表。从环境变量 PYTHONPATH 初始化,加上依赖于安装的默认值。

    【讨论】:

    • 我不知道它可以查看哪些目录。它可以是 /usr 或 /usr/local 或私有 Python 安装,它可以是 dist-packages 或 site-packages。 setuptools 如何知道安装到哪里?
    • @user2539266 更新了答案。看看吧。
    • 对于python3 同上,只是print(sys.path)
    【解决方案3】:

    我不知道在 Python 中执行此操作的好方法(除了从给定根目录爬取目录以使用 os.walk 查找文件)。如果您在 Python 中没有得到更好的答案,您可以在您的操作系统上从 python 执行命令,以在您正在寻找的库上执行标准 Linux/Unix 查找命令。您可以使用subprocess module 来执行此操作。

    【讨论】:

    • 我更喜欢比搜索目录树更“优雅”的解决方案。 setuptools 如何知道安装到哪里?
    • 重点是,即使您可以使用相同的方法来建立默认目录,这也不会允许用户没有使用默认目录的情况。我不知道任何其他方式,但有兴趣看看还有什么其他建议。
    【解决方案4】:

    我通过sys.path找到了我的安装路径:

    my_name = "mypackage"
    def _post_install():
         def find_module_path():
             for p in sys.path:
                 if os.path.isdir(p):
                     for f in os.listdir(p):
                         if f == my_name:
                             return os.path.join(p, f)
         install_path = find_module_path()
         # do something we the install_path
    

    注意:这在包被setuptools注册后有效,如果包已经安装在sys.path内的多个目录中,您可能还需要处理。

    【讨论】:

      【解决方案5】:

      执行此操作的快速命令行方式如下:

      % python3 -c "import sys; print(list(filter(lambda s: s.find('packages') > -1, sys.path)))"
      

      这将列出 python3 的所有包文件夹。例如:

      ['/home/toor/.local/lib/python3.7/site-packages', '/home/toor/.pyenv/versions/3.7.9/lib/python3.7/site-packages']
      

      如果看还是可执行路径:

      % python3 -c "import sys; print(sys.executable)"
      

      输出:

      % /home/toor/.pyenv/versions/3.7.9/bin/python3
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-14
        相关资源
        最近更新 更多