V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
yuhu96
V2EX  ›  问与答

总是搞不对 Python from import 路径的问题。。有什么比较优雅的解决方案

  •  
  •   yuhu96 · 2023-08-17 10:47:08 +08:00 · 1011 次点击
    这是一个创建于 462 天前的主题,其中的信息可能已经有所发展或是发生改变。
    每次搞起来这个就头痛。。

    因为机器的原因,我们不方便用 pip 安装包,通常是把一些需要引用的第三方包直接搬到项目目录里,那里引用到他就放在对应的目录。现在的问题是一个项目中基本每层目录都有引用到。这下直接把一个工具包重复搬可太麻烦了,目录层级都看花了,调试起来四处出问题。有没有什么办法,我直接把工具包放在一个固定的路径,然后各层在 import 的时候都能直接引用,而且不需要在乎绝对路径或者相对路径(如 from ..A from .A 这种操蛋的写法)呢?
    8 条回复    2023-08-17 14:30:20 +08:00
    yingxiangyu
        1
    yingxiangyu  
       2023-08-17 10:49:38 +08:00
    python setup.py install 把每个包手动装一下,不需要 pip ,或者直接放到 site-packages
    TimePPT
        2
    TimePPT  
       2023-08-17 10:56:08 +08:00
    这种情况参照下 PEP582 ? https://peps.python.org/pep-0582/
    xiyou007
        3
    xiyou007  
       2023-08-17 11:00:22 +08:00
    sys.path.append("xxxx") 之类的,
    wliansheng
        4
    wliansheng  
       2023-08-17 11:00:41 +08:00
    把工具包放到系统 path 里面
    ```python
    import sys

    sys.path.append('path')

    # 然后直接 import 就行了
    ```
    NoOneNoBody
        5
    NoOneNoBody  
       2023-08-17 11:49:12 +08:00
    无特定路径三方包就简单了

    任意地方(当然需要权限可及)建个目录,假设这个目录绝对路径为/PathToPackage ,将所有包扔进去
    写个 xxx.pth 文件,是个文本文件,就一行 /PathToPackage ,不需要任何包路径,就是这个目录而已
    然后将这个 xxx.pth 扔进 site-packages 就是了

    PS: 这种情况我没试过编译,不过看你的样子也不需要编译吧
    标准做法肯定是认真写__init__.py 了,上面只是懒人方案
    我自写的一些公共模块(多个项目使用),就是这样做的
    volvo007
        6
    volvo007  
       2023-08-17 12:21:26 +08:00 via iPhone
    同 sys.path.append("xxxx")

    这里有个 tip 是,如果你启用了 autopep 这种自动格式化的插件,他可能会把这一句放到所有引用的最后面导致引用失效

    可以在这句话之后的其他所有 import 之后加 #noqa 注释来规避此问题
    DigitalG
        7
    DigitalG  
       2023-08-17 14:26:55 +08:00
    你能下载的第三方包( pypi 上那种?)都是打包好的吧。pip 支持从本地安装的(建议 pip 升级到最新)。
    `python -m pip install -e ${path to the package}`

    之后就正常 import 使用就好了
    DigitalG
        8
    DigitalG  
       2023-08-17 14:30:20 +08:00
    @DigitalG #7 上面这个"-e"是可编辑的意思,修源文件后 import 也会生效,调试比较方便。如果不需要的话,去掉-e 就是把本地下载的包复制到你的 python 目录里。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1254 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 23:30 · PVG 07:30 · LAX 15:30 · JFK 18:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.