Skip to content

Commit c000b00

Browse files
authored
update learn-stdio.py & readme for multiprocess (#30)
1 parent 6763cc1 commit c000b00

File tree

3 files changed

+102
-40
lines changed

3 files changed

+102
-40
lines changed

README.md

Lines changed: 58 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,17 @@
22

33
## Features
44

5-
0. 跨平台支持:Windows/Mac/Linux支持双击运行[详情点击](https://github.com/Trinkle23897/learn2018-autodown/releases)
5+
0. 跨平台支持:Windows/Mac/Linux 支持双击运行[详情点击](https://github.com/Trinkle23897/learn2018-autodown/releases)
66
1. 下载所有课程公告
77
2. 下载所有课件
88
3. 下载所有作业文件及其批阅情况
99
4. 下载所有课程讨论
1010
5. 下载课程信息
1111
6. 增量更新
1212
7. 可选下载课程
13-
8. 随时按Ctrl+C跳过某个文件的下载
13+
8. 随时按 Ctrl+C 跳过某个文件的下载
1414
9. 下载助教课程
15-
10. 可使用cookie登录
15+
10. 可使用 cookie 登录
1616
11. 多刷刷有利于后台成绩提高,比如以下第三条记录是我的:
1717

1818
![](hint.jpg)
@@ -27,67 +27,101 @@ pip3 install -r requirements.txt --user -U
2727

2828
## Usage
2929

30-
`learn-stdio.py` 中显示的参数和下面是一样的。
30+
### CLI 下载
3131

32-
### 下载选项
32+
```bash
33+
python learn-stdio.py
34+
```
35+
36+
### 原始脚本下载选项
3337

3438
下载当前学期课程(默认)
39+
3540
```bash
36-
./learn.py
41+
python learn_async.py
3742
```
43+
3844
下载所有学期课程
45+
3946
```bash
40-
./learn.py --all
47+
python learn_async.py --all
4148
```
49+
4250
下载指定学期课程
51+
4352
```bash
44-
./learn.py --semester 2018-2019-1 2018-2019-3
53+
python learn_async.py --semester 2018-2019-1 2018-2019-3
4554
```
55+
4656
下载指定课程
57+
4758
```bash
48-
./learn.py --course 计算机网络安全技术 计算机组成原理
59+
python learn_async.py --course 计算机网络安全技术 计算机组成原理
4960
```
61+
5062
跳过某几个课程下载
63+
5164
```bash
52-
./learn.py --ignore 数据结构 "实验室科研探究(1)"
65+
python learn_async.py --ignore 数据结构 "实验室科研探究(1)"
5366
```
67+
5468
移除所有文件夹下完全相同的文件
69+
5570
```bash
56-
./learn.py --clear --all
71+
python learn_async.py --clear --all
5772
```
58-
以上参数均可组合使用,比如我想更新大二的课程,但是不想下载数据结构、实验室科研探究、中国近现代史纲要(课程文件太大了):
73+
74+
指定下载路径
75+
76+
```bash
77+
python learn_async.py --dist your_download_path
78+
```
79+
80+
启用多进程下载
81+
82+
```bash
83+
python learn_async.py --multi
84+
```
85+
86+
启用多进程下载,并指定进程数(如果不指定则默认使用所有 CPU 核心数)
87+
88+
```bash
89+
python learn_async.py --multi --processes 4
90+
```
91+
92+
以上参数均可组合使用,比如我想并发的更新大二的课程到`./download`目录,但是不想下载数据结构、实验室科研探究、中国近现代史纲要(课程文件太大了):
5993

6094
```bash
61-
./learn.py --semester 2017-2018-1 2017-2018-2 2017-2018-3 --ignore 数据结构 "实验室科研探究(2)" 中国近现代史纲要
95+
python learn_async.py --semester 2017-2018-1 2017-2018-2 2017-2018-3 --ignore 数据结构 "实验室科研探究(2)" 中国近现代史纲要 --multi --dist ./download
6296
```
6397

64-
**如果想跳过正在下载的某个文件,按Ctrl+C即可**
98+
**如果想跳过正在下载的某个文件,按 Ctrl+C 即可**
6599

66-
### 登录选项(learn-stdio中禁用
100+
### 登录选项(learn-stdio 中禁用
67101

68-
懒得每次输入info账号密码?创建文件`.pass`写入info账号和密码之后可以自动登录,或者是:
102+
懒得每次输入 info 账号密码?创建文件`.pass`写入 info 账号和密码之后可以自动登录,或者是:
69103

70104
```bash
71-
./learn.py --_pass your_info_file
105+
python learn_async.py --_pass your_info_file
72106
```
73107

74-
其中文件格式为
108+
其中文件格式为
75109

76110
```bash
77111
info账号
78112
info密码
79113
```
80114

81-
使用Cookie登录而不是输入info密码
115+
使用 Cookie 登录而不是输入 info 密码
82116

83117
```bash
84-
./learn.py --cookie your_cookie_filename
118+
python learn_async.py --cookie your_cookie_filename
85119
```
86120

87-
其中cookie文件格式可参考 `example_cookie.txt`
121+
其中 cookie 文件格式可参考 `example_cookie.txt`
88122

89123
## Common Issues
90124

91-
- 卡在login:网络原因,看看pulse-secure关了没,重跑试试看
92-
- `500 : Internal Server Error`:请拉取最新版的脚本。网络学堂自2020/2/22开启强制https
93-
- `info_xxx.csv`在Mac下打开是乱码:别用office,用mac自带的软件吧 :)
125+
- 卡在 login:网络原因,看看 pulse-secure 关了没,重跑试试看
126+
- `500 : Internal Server Error`:请拉取最新版的脚本。网络学堂自 2020/2/22 开启强制 https
127+
- `info_xxx.csv`在 Mac 下打开是乱码:别用 office,用 mac 自带的软件吧 :)

learn-stdio.py

Lines changed: 42 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
#!/usr/bin/env python3
22

33
import time, argparse
4-
from learn import main
4+
from learn_async import main
5+
import os
6+
57

68
def get(help, choices=None, default=None):
79
while True:
@@ -16,26 +18,52 @@ def get(help, choices=None, default=None):
1618
else:
1719
return default
1820

21+
1922
def get_args():
2023
parser = argparse.ArgumentParser()
2124
args = parser.parse_args()
22-
print('按回车选择默认选项 ...')
23-
args.all = get('同步所有学期的所有课程 [y/N]:', choices=['Y', 'N', 'y', 'n'], default=None)
24-
if args.all in ['n', 'N']:
25+
print("按回车选择默认选项 ...")
26+
args.all = get(
27+
"同步所有学期的所有课程 [y/N]:", choices=["Y", "N", "y", "n"], default=None
28+
)
29+
if args.all in ["n", "N"]:
2530
args.all = None
26-
args.clear = get('清空相同文件 [y/N]:', choices=['Y', 'N', 'y', 'n'], default=None)
27-
if args.clear in ['n', 'N']:
31+
args.clear = get("清空相同文件 [y/N]:", choices=["Y", "N", "y", "n"], default=None)
32+
if args.clear in ["n", "N"]:
2833
args.clear = None
29-
args.semester = get('学期:', default=[])
30-
args.course = get('指定课程:', default=[])
31-
args.ignore = get('忽略课程:', default=[])
32-
args._pass = '.pass'
33-
args.cookie = ''
34+
args.semester = get("学期:", default=[])
35+
args.course = get("指定课程:", default=[])
36+
args.ignore = get("忽略课程:", default=[])
37+
args.dist = get("下载路径(默认当前目录):", default="")
38+
if len(args.dist) != 0:
39+
if not os.path.exists(args.dist):
40+
multi = get(
41+
f"路径{args.dist}不存在,是否创建? [Y/n]",
42+
choices=["Y", "N", "y", "n"],
43+
default="Y",
44+
)
45+
if multi in ["y", "Y"]:
46+
os.makedirs(args.dist)
47+
else:
48+
exit()
49+
multi = get("是否启用多进程?[y/N]", choices=["Y", "N", "y", "n"], default="N")
50+
if multi in ["y", "Y"]:
51+
args.multi = True
52+
args.processes = get("进程数(默认使用所有CPU核心数):", default=None)
53+
else:
54+
args.multi = False
55+
args._pass = ".pass"
56+
args.cookie = ""
57+
args.http_proxy = ""
58+
args.https_proxy = ""
59+
args.username = ""
60+
args.password = ""
3461
return args
3562

36-
if __name__ == '__main__':
63+
64+
if __name__ == "__main__":
3765
t = time.time()
3866
main(get_args())
3967
t = time.time() - t
40-
print('耗时: %02d:%02d:%02.0f' % (t // 3600, (t % 3600) // 60, t % 60))
41-
input('请按任意键退出')
68+
print("耗时: %02d:%02d:%02.0f" % (t // 3600, (t % 3600) // 60, t % 60))
69+
input("请按任意键退出")

learn-async.py renamed to learn_async.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -694,9 +694,9 @@ def main(args):
694694
if args.login:
695695
courses = get_courses(args)
696696
if args.multi:
697-
# 如果未指定进程数,则使用课程数量
697+
# 如果未指定进程数,则使用CPU核数
698698
if not args.processes:
699-
args.processes = len(courses)
699+
args.processes = mp.cpu_count()
700700
print(f"启动多进程下载,进程数:{args.processes}")
701701
pool = mp.Pool(processes=args.processes)
702702
process_func = partial(process_course, args=args)

0 commit comments

Comments
 (0)