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

2019-10-31 15:40:51 +08:00
 JCZ2MkKb5S8ZX9pq
root <folder>
 ├ config.py
 ├ main.py
 └ toolbox <folder>
   ├ get_data.py
   └ analyze_data.py
2639 次点击
所在节点    Python
17 条回复
imn1
2019-10-31 15:45:43 +08:00
每层加个 __init__
怎么写?看手册或别人的例子 /文章
JCZ2MkKb5S8ZX9pq
2019-10-31 15:46:51 +08:00
@imn1 嗯,init 有的,手打的目录结构,忘加了。
JCZ2MkKb5S8ZX9pq
2019-10-31 15:56:54 +08:00
我目前所知的几种方法

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

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

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

PS:我 if main 里面以前也是火葬场,后来慢慢理干净了一点,但还在摸索,尚不完善。
Hopetree
2019-10-31 17:21:11 +08:00
变成包啊,不要搞目录,用包,包引用就比较好,而且不容易出错
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
2019-10-31 19:43:16 +08:00
错了,python -m toolbox.get_data
JCZ2MkKb5S8ZX9pq
2019-10-31 20:21:13 +08:00
@ipwx sublime text 可以自己编辑 build 的方式,但貌似没办法转成这个格式。
目录和文件名都能取到,但在 build 配置文件里不知道怎么写。
rogwan
2019-10-31 20:48:59 +08:00
写一个 Config 基类,再分别写 xxConfig 子类,最后在再 config 方法
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
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
2019-11-01 00:46:56 +08:00
@ipwx 其实我的诉求,就是在编辑某个子目录下的文件时,可以方便的 build 跑测试。
不要来回跑上层,或者去第三方打 cmd line。
目前来看这个老哥给的这个方案完全可行。
JCZ2MkKb5S8ZX9pq
2019-11-01 00:55:14 +08:00
这样等于绕开了从下层目录,导入上层目录的 config 这个需求,都是直接从顶层开始跑了。
代码也很干净,没有多余和临时的改动。
@ClericPy 提示了从 IDE 角度去搞,
@ipwx 提示了模块运行,
感谢二位。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/614886

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX