首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
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
Coding
V2EX  ›  Python

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

  •  
  •   JCZ2MkKb5S8ZX9pq · 44 天前 · 1122 次点击
    这是一个创建于 44 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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
        1
    imn1   44 天前
    每层加个 __init__
    怎么写?看手册或别人的例子 /文章
        2
    JCZ2MkKb5S8ZX9pq   44 天前
    @imn1 嗯,init 有的,手打的目录结构,忘加了。
        3
    JCZ2MkKb5S8ZX9pq   44 天前
    我目前所知的几种方法

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

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

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

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

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

    Long answer:

    最好用一个 CLI 框架,比如 click,然后写 setup.py ,安装你的所有命令行入口点为一个独立的程序。
        11
    ipwx   44 天前
    错了,python -m toolbox.get_data
        12
    JCZ2MkKb5S8ZX9pq   44 天前
    @ipwx sublime text 可以自己编辑 build 的方式,但貌似没办法转成这个格式。
    目录和文件名都能取到,但在 build 配置文件里不知道怎么写。
        13
    rogwan   44 天前 via iPhone
    写一个 Config 基类,再分别写 xxConfig 子类,最后在再 config 方法
        14
    ipwx   43 天前
    @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
        15
    JCZ2MkKb5S8ZX9pq   43 天前
    @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 这些魔改的地方不知道要摸多久了。
        16
    JCZ2MkKb5S8ZX9pq   43 天前
    @ipwx 其实我的诉求,就是在编辑某个子目录下的文件时,可以方便的 build 跑测试。
    不要来回跑上层,或者去第三方打 cmd line。
    目前来看这个老哥给的这个方案完全可行。
        17
    JCZ2MkKb5S8ZX9pq   43 天前
    这样等于绕开了从下层目录,导入上层目录的 config 这个需求,都是直接从顶层开始跑了。
    代码也很干净,没有多余和临时的改动。
    @ClericPy 提示了从 IDE 角度去搞,
    @ipwx 提示了模块运行,
    感谢二位。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2335 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 37ms · UTC 12:56 · PVG 20:56 · LAX 04:56 · JFK 07:56
    ♥ Do have faith in what you're doing.