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

一个项目设置的小白问题请益

  •  
  •   JCZ2MkKb5S8ZX9pq · 2019-10-31 15:40:51 +08:00 · 2552 次点击
    这是一个创建于 1632 天前的主题,其中的信息可能已经有所发展或是发生改变。
    root <folder>
     ├ config.py
     ├ main.py
     └ toolbox <folder>
       ├ get_data.py
       └ analyze_data.py
    
    • 假设是这么个结构
    • 我希望在一个 setting 或者 config 里,统一配置一些通用项,比如服务器地址,目录,常量,等等。这样查找修改方便点。
    • 在 main 里面调用是没问题。
    • 现在问题是,在写 toolbox 内的模块的时候,比如 getdata,一般想写的时候直接运行一下的话,因为 config 在它上层,请问怎么调用比较好?
    • 如果用 sys 加个路径,然后再 import,是也可以运行,但 pep8 会报错。
    • 退到程序根目录运行也是可以的,但没有那么地方便。
    • 不知道各位是怎么处理这个问题的,可以的话请指点一下。
    17 条回复    2019-11-01 00:55:14 +08:00
    imn1
        1
    imn1  
       2019-10-31 15:45:43 +08:00
    每层加个 __init__
    怎么写?看手册或别人的例子 /文章
    JCZ2MkKb5S8ZX9pq
        2
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-10-31 15:46:51 +08:00
    @imn1 嗯,init 有的,手打的目录结构,忘加了。
    JCZ2MkKb5S8ZX9pq
        3
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-10-31 15:56:54 +08:00
    我目前所知的几种方法

    - from ..config import * 只能从根目录运行,我想写模块的时候直接^B 运行。
    - sys.path.append 放在 import 前面,不符合 pep8。(当然也可以把格式检查关了)
    - 把所有常量都设为参数往里传,很麻烦,有些也需要全局。
    JCZ2MkKb5S8ZX9pq
        4
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-10-31 16:17:29 +08:00
    try:
    from ..config import *
    except ValueError:
    import sys
    sys.path.append('../')
    from config import *

    写成这样也行,就是看上去非常罗嗦。。。
    ClericPy
        5
    ClericPy  
       2019-10-31 16:25:45 +08:00
    还是好好理解一下包和模块的概念吧... 很多相对引用其实也会被 linter 划红线(我就经常用 ..)
    功能统一写到 package 里
    调用统一在包外(这样 cwd 就不会乱了), 就算是包内常见调用, 也可以在包里写好 main, 在包外调用, 更清晰直观一点. 包内引用就可以只用相对引用了

    总之尽可能别用 sys.path append 的方式吧. 对于一个靠谱的 IDE / 编辑器, 在项目根目录执行也就是一个快捷键的事
    JCZ2MkKb5S8ZX9pq
        6
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-10-31 16:44:06 +08:00
    @ClericPy 你倒提醒我了,我去看看 IDE 有没有从根目录执行的办法。
    ClericPy
        7
    ClericPy  
       2019-10-31 16:51:17 +08:00
    @JCZ2MkKb5S8ZX9pq python3.3 以后 __init__.py 也不是必须的了, 总之就是尽量不要在包内做那些奇怪的引用, 不然那跟普通文件夹还有什么区别 (虽然我超喜欢这种操作, 在 if __main__ 里... 不过都是 utils.py 这种不引用包内其他模块的前提下)
    我的 vscode 里 code runner 默认还是在项目根目录来着, 后来被我改成的从当前文件执行...
    JCZ2MkKb5S8ZX9pq
        8
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-10-31 16:59:27 +08:00
    @ClericPy 主要是主程序跑的时候还行,但写的过程中有点麻烦。
    可是也不想施工时候一套,竣工之后又一套,就想问看看有没有什么好方法。

    PS:我 if main 里面以前也是火葬场,后来慢慢理干净了一点,但还在摸索,尚不完善。
    Hopetree
        9
    Hopetree  
       2019-10-31 17:21:11 +08:00
    变成包啊,不要搞目录,用包,包引用就比较好,而且不容易出错
    ipwx
        10
    ipwx  
       2019-10-31 19:42:51 +08:00
    Short answer:

    在 root 目录内,运行:python -m toolbox.get_data.py

    Long answer:

    最好用一个 CLI 框架,比如 click,然后写 setup.py ,安装你的所有命令行入口点为一个独立的程序。
    ipwx
        11
    ipwx  
       2019-10-31 19:43:16 +08:00
    错了,python -m toolbox.get_data
    JCZ2MkKb5S8ZX9pq
        12
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-10-31 20:21:13 +08:00
    @ipwx sublime text 可以自己编辑 build 的方式,但貌似没办法转成这个格式。
    目录和文件名都能取到,但在 build 配置文件里不知道怎么写。
    rogwan
        13
    rogwan  
       2019-10-31 20:48:59 +08:00 via iPhone
    写一个 Config 基类,再分别写 xxConfig 子类,最后在再 config 方法
    ipwx
        14
    ipwx  
       2019-10-31 23:35:15 +08:00
    @JCZ2MkKb5S8ZX9pq setup.py 是 Python 标准的包安装文件。。。和具体某个 IDE 无关。

    比如我这个项目:

    https://github.com/haowen-xu/ml-essentials

    setup.py ,指定把 mltk.mlrunner 模块(即 mltk/mlrunner.py )中的函数 mlrun 做成命令行程序。

    https://github.com/haowen-xu/ml-essentials/blob/master/setup.py#L62
    https://github.com/haowen-xu/ml-essentials/blob/master/mltk/mlrunner.py#L691
    JCZ2MkKb5S8ZX9pq
        15
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-11-01 00:44:28 +08:00
    @ipwx 配合你的提醒,我去官方论坛问了下,有个老哥直接给撸了段插件,搞定了。

    [How can I create a new build system to run python from project root? - Technical Support - Sublime Forum]( https://forum.sublimetext.com/t/how-can-i-create-a-new-build-system-to-run-python-from-project-root/47461)

    爱死这个老哥了,自己摸 sublime 这些魔改的地方不知道要摸多久了。
    JCZ2MkKb5S8ZX9pq
        16
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-11-01 00:46:56 +08:00
    @ipwx 其实我的诉求,就是在编辑某个子目录下的文件时,可以方便的 build 跑测试。
    不要来回跑上层,或者去第三方打 cmd line。
    目前来看这个老哥给的这个方案完全可行。
    JCZ2MkKb5S8ZX9pq
        17
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-11-01 00:55:14 +08:00
    这样等于绕开了从下层目录,导入上层目录的 config 这个需求,都是直接从顶层开始跑了。
    代码也很干净,没有多余和临时的改动。
    @ClericPy 提示了从 IDE 角度去搞,
    @ipwx 提示了模块运行,
    感谢二位。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1154 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 18:19 · PVG 02:19 · LAX 11:19 · JFK 14:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.