Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
a14c74da
T
TDengine
项目概览
taosdata
/
TDengine
1 年多 前同步成功
通知
1185
Star
22016
Fork
4786
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
a14c74da
编写于
8月 16, 2022
作者:
S
Shengliang Guan
浏览文件
操作
浏览文件
下载
差异文件
Merge remote-tracking branch 'origin/3.0' into fix/TD-18437
上级
e73a311a
0166ecfe
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
363 addition
and
128 deletion
+363
-128
docs/zh/05-get-started/03-package.md
docs/zh/05-get-started/03-package.md
+16
-14
docs/zh/07-develop/07-tmq.mdx
docs/zh/07-develop/07-tmq.mdx
+210
-111
docs/zh/14-reference/15-taosKeeper.md
docs/zh/14-reference/15-taosKeeper.md
+134
-0
tests/system-test/simpletest.bat
tests/system-test/simpletest.bat
+3
-3
未找到文件。
docs/zh/05-get-started/03-package.md
浏览文件 @
a14c74da
...
...
@@ -9,47 +9,49 @@ import PkgListV3 from "/components/PkgListV3";
TDengine 完整的软件包包括服务端(taosd)、用于与第三方系统对接并提供 RESTful 接口的 taosAdapter、应用驱动(taosc)、命令行程序 (CLI,taos) 和一些工具软件,目前服务端 taosd 和 taosAdapter 仅在 Linux 系统上安装和运行,后续将支持 Windows、macOS 等系统。应用驱动 taosc 与 TDengine CLI 可以在 Windows 或 Linux 上安装和运行。TDengine 除了提供多种语言的连接器之外,还通过
[
taosAdapter
](
../../reference/taosadapter/
)
提供
[
RESTful 接口
](
../../reference/rest-api/
)
。
在 Linux 系统上,TDengine 开源版本提供 deb 和 rpm 格式安装包,用户可以根据自己的运行环境选择合适的安装包。其中 deb 支持 Debian/Ubuntu 及衍生系统,rpm 支持 CentOS/RHEL/SUSE 及衍生系统。同时我们也为企业用户提供 tar.gz 格式安装包,也支持通过
`apt-get`
工具从线上进行安装。TDengine 也提供 Windows x64 平台的安装包。您也可以
[
用 Docker 立即体验
](
../../get-started/docker/
)
。如果您希望对 TDengine 贡献代码或对内部实现感兴趣,请参考我们的
[
TDengine GitHub 主页
](
https://github.com/taosdata/TDengine
)
下载源码构建和安装.
为方便使用,标准的服务端安装包包含了 taos、taosd、taosAdapter、taosdump、taosBenchmark、TDinsight 安装脚本和示例代码;如果您只需要用到服务端程序和客户端连接的 C/C++ 语言支持,也可以仅下载 lite 版本的安装包。
在安装包格式上,我们提供 tar.gz, rpm 和 deb 格式,为企业客户提供 tar.gz 格式安装包,以方便在特定操作系统上使用。需要注意的是,rpm 和 deb 包不含 taosdump 和 TDinsight 安装脚本,这些工具需要通过安装 taosTool 包获得。
在 Linux 系统上,TDengine 开源版本提供 deb 和 rpm 格式安装包,用户可以根据自己的运行环境选择合适的安装包。其中 deb 支持 Debian/Ubuntu 及衍生系统,rpm 支持 CentOS/RHEL/SUSE 及衍生系统。同时我们也为企业用户提供 tar.gz 格式安装包,也支持通过
`apt-get`
工具从线上进行安装。TDengine 也提供 Windows x64 平台的安装包。您也可以
[
用 Docker 立即体验
](
../../get-started/docker/
)
。需要注意的是,rpm 和 deb 包不含 taosdump 和 TDinsight 安装脚本,这些工具需要通过安装 taosTool 包获得。如果您希望对 TDengine 贡献代码或对内部实现感兴趣,请参考我们的
[
TDengine GitHub 主页
](
https://github.com/taosdata/TDengine
)
下载源码构建和安装.
## 安装
<Tabs>
<TabItem
label=
"Deb 安装"
value=
"debinst"
>
1.
从列表中下载获得 deb 安装包
,例如 TDengine-server-3.0.0.0-Linux-x64.deb
;
1.
从列表中下载获得 deb 安装包;
<PkgListV3
type=
{6}/
>
2.
进入到
TDengine-server-3.0.0.0-Linux-x64.deb
安装包所在目录,执行如下的安装命令:
2.
进入到安装包所在目录,执行如下的安装命令:
```
bash
sudo
dpkg
-i
TDengine-server-3.0.0.0-Linux-x64.deb
# 替换为下载的安装包版本
sudo
dpkg
-i
TDengine-server-<version>-Linux-x64.deb
```
</TabItem>
<TabItem
label=
"RPM 安装"
value=
"rpminst"
>
1.
从列表中下载获得 rpm 安装包
,例如 TDengine-server-3.0.0.0-Linux-x64.rpm
;
1.
从列表中下载获得 rpm 安装包;
<PkgListV3
type=
{5}/
>
2.
进入到
TDengine-server-3.0.0.0-Linux-x64.rpm
安装包所在目录,执行如下的安装命令:
2.
进入到安装包所在目录,执行如下的安装命令:
```
bash
sudo
rpm
-ivh
TDengine-server-3.0.0.0-Linux-x64.rpm
# 替换为下载的安装包版本
sudo
rpm
-ivh
TDengine-server-<version>-Linux-x64.rpm
```
</TabItem>
<TabItem
label=
"tar.gz 安装"
value=
"tarinst"
>
1.
从列表中下载获得 tar.gz 安装包
,例如 TDengine-server-3.0.0.0-Linux-x64.tar.gz
;
1.
从列表中下载获得 tar.gz 安装包;
<PkgListV3
type=
{0}/
>
2.
进入到
TDengine-server-3.0.0.0-Linux-x64.tar.gz
安装包所在目录,先解压文件后,进入子目录,执行其中的 install.sh 安装脚本:
2.
进入到安装包所在目录,先解压文件后,进入子目录,执行其中的 install.sh 安装脚本:
```
bash
tar
-zxvf
TDengine-server-3.0.0.0-Linux-x64.tar.gz
# 替换为下载的安装包版本
tar
-zxvf
TDengine-server-<version>-Linux-x64.tar.gz
```
解压后进入相应路径,执行
...
...
@@ -66,9 +68,9 @@ install.sh 安装脚本在执行过程中,会通过命令行交互界面询问
<TabItem
label=
"Windows 安装"
value=
"windows"
>
1.
从列表中下载获得 exe 安装程序
,例如 TDengine-server-3.0.0.0-Windows-x64.exe
;
1.
从列表中下载获得 exe 安装程序;
<PkgListV3
type=
{3}/
>
2.
运行
TDengine-server-3.0.0.0-Windows-x64.exe
来安装 TDengine。
2.
运行
可执行程序
来安装 TDengine。
</TabItem>
<TabItem
value=
"apt-get"
label=
"apt-get"
>
...
...
docs/zh/07-develop/07-tmq.mdx
浏览文件 @
a14c74da
...
...
@@ -132,6 +132,58 @@ func (c *Consumer) Unsubscribe() error
</TabItem>
<TabItem label="Rust" value="Rust">
```rust
impl TBuilder for TmqBuilder
fn from_dsn<D: IntoDsn>(dsn: D) -> Result<Self, Self::Error>
fn build(&self) -> Result<Self::Target, Self::Error>
impl AsAsyncConsumer for Consumer
async fn subscribe<T: Into<String>, I: IntoIterator<Item = T> + Send>(
&mut self,
topics: I,
) -> Result<(), Self::Error>;
fn stream(
&self,
) -> Pin<
Box<
dyn '_
+ Send
+ futures::Stream<
Item = Result<(Self::Offset, MessageSet<Self::Meta, Self::Data>), Self::Error>,
>,
>,
>;
async fn commit(&self, offset: Self::Offset) -> Result<(), Self::Error>;
async fn unsubscribe(self);
```
可在 <https://docs.rs/taos> 上查看详细 API 说明。
</TabItem>
<TabItem label="Node.JS" value="Node.JS">
```js
function TMQConsumer(config)
function subscribe(topic)
function consume(timeout)
function subscription()
function unsubscribe()
function commit(msg)
function close()
```
</TabItem>
<TabItem value="C#" label="C#">
```csharp
...
...
@@ -157,27 +209,6 @@ void Close()
```
</TabItem>
<TabItem label="Node.JS" value="Node.JS">
```node
function TMQConsumer(config)
function subscribe(topic)
function consume(timeout)
function subscription()
function unsubscribe()
function commit(msg)
function close()
```
</TabItem>
</Tabs>
## 写入数据
...
...
@@ -321,28 +352,6 @@ public class MetersDeserializer extends ReferenceDeserializer<Meters> {
</TabItem>
<TabItem value="Python" label="Python">
Python 使用以下配置项创建一个 Consumer 实例。
| 参数名称 | 类型 | 参数说明 | 备注 |
| :----------------------------: | :-----: | -------------------------------------------------------- | ------------------------------------------- |
| `td_connect_ip` | string | 用于创建连接,同 `taos_connect` | |
| `td_connect_user` | string | 用于创建连接,同 `taos_connect` | |
| `td_connect_pass` | string | 用于创建连接,同 `taos_connect` | |
| `td_connect_port` | string | 用于创建连接,同 `taos_connect` | |
| `group_id` | string | 消费组 ID,同一消费组共享消费进度 | **必填项**。最大长度:192。 |
| `client_id` | string | 客户端 ID | 最大长度:192。 |
| `auto_offset_reset` | string | 消费组订阅的初始位置 | 可选:`earliest`, `latest`, `none`(default) |
| `enable_auto_commit` | string | 启用自动提交 | 合法值:`true`, `false`。 |
| `auto_commit_interval_ms` | string | 以毫秒为单位的自动提交时间间隔 | |
| `enable_heartbeat_background` | string | 启用后台心跳,启用后即使长时间不 poll 消息也不会造成离线 | 合法值:`true`, `false` |
| `experimental_snapshot_enable` | string | 从 WAL 开始消费,还是从 TSBS 开始消费 | 合法值:`true`, `false` |
| `msg_with_table_name` | string | 是否允许从消息中解析表名 | 合法值:`true`, `false` |
| `timeout` | int | 消费者拉去的超时时间 | |
</TabItem>
<TabItem label="Go" value="Go">
```go
...
...
@@ -394,35 +403,46 @@ if err != nil {
</TabItem>
<TabItem
value="C#" label="C#
">
<TabItem
label="Rust" value="Rust
">
```csharp
using TDengineTMQ;
```rust
let mut dsn: Dsn = "taos://".parse()?;
dsn.set("group.id", "group1");
dsn.set("client.id", "test");
dsn.set("auto.offset.reset", "earliest");
// 根据需要,设置消费组 (GourpId)、自动提交 (EnableAutoCommit)、
// 自动提交时间间隔 (AutoCommitIntervalMs)、用户名 (TDConnectUser)、密码 (TDConnectPasswd) 等参数
var cfg = new ConsumerConfig
{
EnableAutoCommit = "true"
AutoCommitIntervalMs = "1000"
GourpId = "TDengine-TMQ-C#",
TDConnectUser = "root",
TDConnectPasswd = "taosdata",
AutoOffsetReset = "earliest"
MsgWithTableName = "true",
TDConnectIp = "127.0.0.1",
TDConnectPort = "6030"
};
var consumer = new ConsumerBuilder(cfg).Build();
let tmq = TmqBuilder::from_dsn(dsn)?;
let mut consumer = tmq.build()?;
```
</TabItem>
<TabItem value="Python" label="Python">
Python 使用以下配置项创建一个 Consumer 实例。
| 参数名称 | 类型 | 参数说明 | 备注 |
| :----------------------------: | :----: | -------------------------------------------------------- | ------------------------------------------- |
| `td_connect_ip` | string | 用于创建连接,同 `taos_connect` | |
| `td_connect_user` | string | 用于创建连接,同 `taos_connect` | |
| `td_connect_pass` | string | 用于创建连接,同 `taos_connect` | |
| `td_connect_port` | string | 用于创建连接,同 `taos_connect` | |
| `group_id` | string | 消费组 ID,同一消费组共享消费进度 | **必填项**。最大长度:192。 |
| `client_id` | string | 客户端 ID | 最大长度:192。 |
| `auto_offset_reset` | string | 消费组订阅的初始位置 | 可选:`earliest`, `latest`, `none`(default) |
| `enable_auto_commit` | string | 启用自动提交 | 合法值:`true`, `false`。 |
| `auto_commit_interval_ms` | string | 以毫秒为单位的自动提交时间间隔 | |
| `enable_heartbeat_background` | string | 启用后台心跳,启用后即使长时间不 poll 消息也不会造成离线 | 合法值:`true`, `false` |
| `experimental_snapshot_enable` | string | 从 WAL 开始消费,还是从 TSBS 开始消费 | 合法值:`true`, `false` |
| `msg_with_table_name` | string | 是否允许从消息中解析表名 | 合法值:`true`, `false` |
| `timeout` | int | 消费者拉去的超时时间 | |
</TabItem>
<TabItem label="Node.JS" value="Node.JS">
```
node
```
js
// 根据需要,设置消费组 (group.id)、自动提交 (enable.auto.commit)、
// 自动提交时间间隔 (auto.commit.interval.ms)、用户名 (td.connect.user)、密码 (td.connect.pass) 等参数
...
...
@@ -437,6 +457,31 @@ let consumer = taos.consumer({
'td.connect.ip','127.0.0.1',
'td.connect.port','6030'
});
```
</TabItem>
<TabItem value="C#" label="C#">
```csharp
using TDengineTMQ;
// 根据需要,设置消费组 (GourpId)、自动提交 (EnableAutoCommit)、
// 自动提交时间间隔 (AutoCommitIntervalMs)、用户名 (TDConnectUser)、密码 (TDConnectPasswd) 等参数
var cfg = new ConsumerConfig
{
EnableAutoCommit = "true"
AutoCommitIntervalMs = "1000"
GourpId = "TDengine-TMQ-C#",
TDConnectUser = "root",
TDConnectPasswd = "taosdata",
AutoOffsetReset = "earliest"
MsgWithTableName = "true",
TDConnectIp = "127.0.0.1",
TDConnectPort = "6030"
};
var consumer = new ConsumerBuilder(cfg).Build();
```
...
...
@@ -487,28 +532,25 @@ if err != nil {
```
</TabItem>
<TabItem value="Rust" label="Rust">
<TabItem value="C#" label="C#">
```csharp
// 创建订阅 topics 列表
List<String> topics = new List<string>();
topics.add("tmq_topic");
// 启动订阅
consumer.Subscribe(topics);
```rust
consumer.subscribe(["tmq_meters"]).await?;
```
</TabItem>
<TabItem value="Python" label="Python">
```python
consumer = TaosConsumer('topic_ctb_column', group_id='vg2')
```
</TabItem>
<TabItem label="Node.JS" value="Node.JS">
```
node
```
js
// 创建订阅 topics 列表
let topics = ['topic_test']
...
...
@@ -518,6 +560,18 @@ consumer.subscribe(topics);
</TabItem>
<TabItem value="C#" label="C#">
```csharp
// 创建订阅 topics 列表
List<String> topics = new List<string>();
topics.add("tmq_topic");
// 启动订阅
consumer.Subscribe(topics);
```
</TabItem>
</Tabs>
## 消费
...
...
@@ -551,14 +605,6 @@ while(running){
</TabItem>
<TabItem value="Python" label="Python">
```python
for msg in consumer:
for row in msg:
print(row)
```
</TabItem>
<TabItem value="Go" label="Go">
```go
...
...
@@ -575,6 +621,64 @@ for {
</TabItem>
<TabItem value="Rust" label="Rust">
```rust
{
let mut stream = consumer.stream();
while let Some((offset, message)) = stream.try_next().await? {
// get information from offset
// the topic
let topic = offset.topic();
// the vgroup id, like partition id in kafka.
let vgroup_id = offset.vgroup_id();
println!("* in vgroup id {vgroup_id} of topic {topic}\n");
if let Some(data) = message.into_data() {
while let Some(block) = data.fetch_raw_block().await? {
// one block for one table, get table name if needed
let name = block.table_name();
let records: Vec<Record> = block.deserialize().try_collect()?;
println!(
"** table: {}, got {} records: {:#?}\n",
name.unwrap(),
records.len(),
records
);
}
}
consumer.commit(offset).await?;
}
}
```
</TabItem>
<TabItem value="Python" label="Python">
```python
for msg in consumer:
for row in msg:
print(row)
```
</TabItem>
<TabItem label="Node.JS" value="Node.JS">
```js
while(true){
msg = consumer.consume(200);
// process message(consumeResult)
console.log(msg.topicPartition);
console.log(msg.block);
console.log(msg.fields)
}
```
</TabItem>
<TabItem value="C#" label="C#">
```csharp
...
...
@@ -590,20 +694,6 @@ while (true)
</TabItem>
<TabItem label="Node.JS" value="Node.JS">
```node
while(true){
msg = consumer.consume(200);
// process message(consumeResult)
console.log(msg.topicPartition);
console.log(msg.block);
console.log(msg.fields)
}
```
</TabItem>
</Tabs>
## 结束消费
...
...
@@ -634,16 +724,6 @@ consumer.close();
</TabItem>
<TabItem value="Python" label="Python">
```python
/* 取消订阅 */
consumer.unsubscribe();
/* 关闭消费 */
consumer.close();
</TabItem>
<TabItem value="Go" label="Go">
...
...
@@ -652,26 +732,45 @@ consumer.Close()
```
</TabItem>
<TabItem value="C#" label="C#">
```csharp
// 取消订阅
consumer.Unsubscribe();
<TabItem value="Rust" label="Rust">
// 关闭消费
consumer.
Close()
;
```rust
consumer.
unsubscribe().await
;
```
</TabItem>
<TabItem value="Python" label="Python">
```py
# 取消订阅
consumer.unsubscribe()
# 关闭消费
consumer.close()
```
</TabItem>
<TabItem label="Node.JS" value="Node.JS">
```
node
```
js
consumer.unsubscribe();
consumer.close();
```
</TabItem>
<TabItem value="C#" label="C#">
```csharp
// 取消订阅
consumer.Unsubscribe();
// 关闭消费
consumer.Close();
```
</TabItem>
</Tabs>
## 删除 *topic*
...
...
docs/zh/14-reference/15-taosKeeper.md
0 → 100644
浏览文件 @
a14c74da
---
sidebar_label
:
taosKeeper
title
:
taosKeeper
description
:
TDengine taosKeeper 使用说明
---
## 简介
TaosKeeper 是 TDengine 3.0 版本监控指标的导出工具,通过简单的几项配置即可获取 TDengine 的运行状态。taosKeeper 使用 TDengine RESTful 接口,所以不需要安装 TDengine 客户端即可使用。
## 安装
<!-- taosKeeper 有两种安装方式: -->
taosKeeper 安装方式:
<!-- - 安装 TDengine 官方安装包的同时会自动安装 taosKeeper, 详情请参考[ TDengine 安装](/operation/pkg-install)。-->
<!-- - 单独编译 taosKeeper 并安装,详情请参考 [taosKeeper](https://github.com/taosdata/taoskeeper) 仓库。-->
-
单独编译 taosKeeper 并安装,详情请参考
[
taosKeeper
](
https://github.com/taosdata/taoskeeper
)
仓库。
## 运行
### 配置和运行方式
<!-- taosKeeper 需要在操作系统终端执行,该工具支持两种配置方式:[命令行参数](#命令行参数启动) 和 [配置文件](#配置文件启动)。命令行参数优先级高于配置文件参数。-->
taosKeeper 需要在操作系统终端执行,该工具支持
[
配置文件启动
](
#配置文件启动
)
。
**在运行 taosKeeper 之前要确保 TDengine 集群与 taosAdapter 已经在正确运行。**
<!--
### 命令行参数启动
在使用命令行参数运行 taosBenchmark 并控制其行为。
```
shell
taosKeeper
```
-->
### 配置文件启动
执行以下命令即可快速体验 taosKeeper。当不指定 taosKeeper 配置文件时,优先使用
`/etc/taos/keeper.toml`
配置,否则将使用默认配置。
```
shell
taoskeeper
-c
<keeper config file>
```
**下面是配置文件的示例:**
```
toml
# gin 框架是否启用 debug
debug
=
false
# 服务监听端口, 默认为 6043
port
=
6043
# 日志级别,包含 panic、error、info、debug、trace等
loglevel
=
"info"
# 程序中使用协程池的大小
gopoolsize
=
50000
# 查询 TDengine 监控数据轮询间隔
RotationInterval
=
"15s"
[tdengine]
host
=
"127.0.0.1"
port
=
6041
username
=
"root"
password
=
"taosdata"
# 需要被监控的 taosAdapter
[taosAdapter]
address
=
["127.0.0.1:6041","192.168.1.95:6041"]
[metrics]
# 监控指标前缀
prefix
=
"taos"
# 集群数据的标识符
cluster
=
"production"
# 存放监控数据的数据库
database
=
"log"
# 指定需要监控的普通表
tables
=
["normal_table"]
```
### 获取监控指标
taosKeeper 作为 TDengine 监控指标的导出工具,可以将 TDengine 产生的监控数据记录在指定数据库中,并提供导出接口。
#### 查看监控结果集
```
shell
$
taos
#
>
use log
;
>
select
*
from cluster_info limit 1
;
```
结果示例:
```
shell
ts | first_ep | first_ep_dnode_id | version | master_uptime | monitor_interval | dbs_total | tbs_total | stbs_total | dnodes_total | dnodes_alive | mnodes_total | mnodes_alive | vgroups_total | vgroups_alive | vnodes_total | vnodes_alive | connections_total | protocol | cluster_id |
===============================================================================================================================================================================================================================================================================================================================================================================
2022-08-16 17:37:01.629 | hlb:6030 | 1 | 3.0.0.0 | 0.27250 | 15 | 2 | 27 | 38 | 1 | 1 | 1 | 1 | 4 | 4 | 4 | 4 | 14 | 1 | 5981392874047724755 |
Query OK, 1 rows
in
database
(
0.036162s
)
```
#### 导出监控指标
```
shell
curl http://127.0.0.1:6043/metrics
```
部分结果集:
```
shell
# HELP taos_cluster_info_connections_total
# TYPE taos_cluster_info_connections_total counter
taos_cluster_info_connections_total
{
cluster_id
=
"5981392874047724755"
}
16
# HELP taos_cluster_info_dbs_total
# TYPE taos_cluster_info_dbs_total counter
taos_cluster_info_dbs_total
{
cluster_id
=
"5981392874047724755"
}
2
# HELP taos_cluster_info_dnodes_alive
# TYPE taos_cluster_info_dnodes_alive counter
taos_cluster_info_dnodes_alive
{
cluster_id
=
"5981392874047724755"
}
1
# HELP taos_cluster_info_dnodes_total
# TYPE taos_cluster_info_dnodes_total counter
taos_cluster_info_dnodes_total
{
cluster_id
=
"5981392874047724755"
}
1
# HELP taos_cluster_info_first_ep
# TYPE taos_cluster_info_first_ep gauge
taos_cluster_info_first_ep
{
cluster_id
=
"5981392874047724755"
,value
=
"hlb:6030"
}
1
```
\ No newline at end of file
tests/system-test/simpletest.bat
浏览文件 @
a14c74da
...
...
@@ -4,9 +4,9 @@ python3 .\test.py -f 0-others\taosShellError.py
python3
.\test.py
-f
0
-others
\taosShellNetChk.py
python3
.\test.py
-f
0
-others
\telemetry.py
python3
.\test.py
-f
0
-others
\taosdMonitor.py
python3
.\test.py
-f
0
-others
\udfTest.py
python3
.\test.py
-f
0
-others
\udf_create.py
python3
.\test.py
-f
0
-others
\udf_restart_taosd.py
@REM
python3 .\test.py -f 0-others\udfTest.py
@REM
python3 .\test.py -f 0-others\udf_create.py
@REM
python3 .\test.py -f 0-others\udf_restart_taosd.py
@REM python3 .\test.py -f 0-others\cachelast.py
@REM python3 .\test.py -f 0-others\user_control.py
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录