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

问个好基础的 import 路径问题

  •  
  •   imn1 · 2020-06-18 14:25:46 +08:00 · 1905 次点击
    这是一个创建于 1620 天前的主题,其中的信息可能已经有所发展或是发生改变。
    目录结构
    folder:
    --common.py
    --A
    ----__init__.py 0 字节空文件
    ----a.py
    --B
    ----__init__.py 0 字节空文件
    ----b.py
    就是 folder 为根目录,A 和 B 是 folder 的子目录

    common.py 里面
    from A import ...
    ...
    解释一下,common 会被多个模块调用,算是前置,它部分内容从 A.a 获取并计算


    b.py 里面
    import sys
    sys.path.append('..')
    from common import ...
    ...
    if __name__ == '__main__':
    ...


    现在情况:
    folder> py ./B/b.py
    “找不到 commn 模块,b.py 第 n 行”
    B> py ./b.py
    “找不到 A 模块,common.py 第 n 行”

    暂时用其他方案是解决了,但想知道:
    1.b.py 能否直接运行?
    2.这种情况,b.py 该怎么写 import ?
    5 条回复    2020-06-18 23:27:13 +08:00
    xiaolinjia
        1
    xiaolinjia  
       2020-06-18 14:30:52 +08:00   ❤️ 1
    b.py 里要写

    sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

    相当于将 folder 加入到 Python 路径下。
    Vegetable
        2
    Vegetable  
       2020-06-18 14:42:58 +08:00   ❤️ 2
    这个做法不是一个很好的习惯,但是写代码难免会遇到。
    1 楼的代码时正确的,不过我更喜欢用这种写法

    from pathlib import Path
    import sys
    sys.path.append(Path(__file__).parent.parent.absolute().__str__())

    from common import *

    这样的代码非常的 dirty,排序引用时会破坏代码结构,看起来也很乱。

    记住一个核心,把项目的根目录的绝对路径加入到 path 中就行了。
    imn1
        3
    imn1  
    OP
       2020-06-18 14:53:18 +08:00
    @Vegetable
    @xiaolinjia
    就是说导入绝对路径么?这么说我懂了,谢谢

    我另外一些模块是用绝对路径导入的,只是那些模块是多个项目可用的
    单个项目内也用绝对路径,这个是没转过弯来
    JCZ2MkKb5S8ZX9pq
        4
    JCZ2MkKb5S8ZX9pq  
       2020-06-18 23:10:18 +08:00 via iPhone   ❤️ 1
    这个我一开始也绕过。

    现在是项目相关的走根目录,比如 from config import *

    自有通用工具都放一个目录,比如 util,加到 path 。
    然后 from util.atool import atool
    JCZ2MkKb5S8ZX9pq
        5
    JCZ2MkKb5S8ZX9pq  
       2020-06-18 23:27:13 +08:00 via iPhone
    另外模块化调用
    folder> py ./B/b.py
    变成
    folder> python -m b.b

    缺点是有时忘了会调用错误,但直接集成到 sublime 的 build 了,就问题不大。而且自那以后,项目结构有改好一点,一开始都平级目录一堆 py……
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1272 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 23:51 · PVG 07:51 · LAX 15:51 · JFK 18:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.