Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 31 additions & 7 deletions kaggle_run.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,9 @@ def get_ka():
return ka


def pull_push():
def get_kernels():
"""
获取配置信息、用户、内核
https://github.com/Kaggle/kaggle-api#kernels
其中cli后缀函数是用于shell中执行:
kernel_pull(self, user_name, kernel_slug, kwargs)
Expand All @@ -75,10 +76,36 @@ def pull_push():
kernels_status_cli(self, kernel, kernel_opt)
"""
ka = get_ka()

user = ka.config_values[ka.CONFIG_NAME_USER] # 获取当前用户

kls = ka.kernels_list(user=user) # 指定用户的内核
return ka, kls, user


def download_kernels():
"""
下载所有内核
:return:
"""
ka, kls, user = get_kernels()
print(kls)
# kls_list = [kls[i:i + 6] for i in range(0, len(kls), 6)]
for kl in kls:
name = re.sub(r"\.|_", "-", str(kl)) # 只能包含字母数字和-
fully_name = user + "/" + name
try:
res = ka.kernels_status(fully_name) # 获取内核运行状态
print(res)
ka.kernels_pull(fully_name, "kaggle_kernels")
except ApiException as e:
print(fully_name, e.status, e.reason)


def pull_push():
"""
下载元数据并推送
:return:
"""
ka, kls, user = get_kernels()
print(kls)
# kls_list = [kls[i:i + 6] for i in range(0, len(kls), 6)]
running_qty = 0
Expand Down Expand Up @@ -198,10 +225,7 @@ def kernels_initialize(api, name, folder):


if __name__ == '__main__':
# run()
# 第一个参数是时间间隔(单位是秒,只有秒),第二个参数是要调用的函数名,第三个参数是调用函数的参数(tuple)
# t = Timer(inc, run, (inc,))
# t.start()
# download_kernels()
# 注意 sched 模块不是循环的,一次调度被执行后就结束了,如果想再执行,请再次 enter
# 四个参数分别为:间隔事件、优先级(用于同时间到达的两个事件同时执行时定序)、被调用触发的函数,给该触发函数的参数(tuple形式)
schedule.enter(0, 0, pull_push) # 提交拉取的内核
Expand Down
92 changes: 92 additions & 0 deletions ping_oracle.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
# @Author : https://www.bajins.com
# @Description : 获取Oracle云各个区域的延迟
# @File : ping_oracle.py
# @Version: 1.1.0
# @Time : 2020/7/26 11:00
# @Project: scripts_python
# @Package:
# @Software: PyCharm
from collections import namedtuple
from pythonping import ping
from prettytable import PrettyTable

lists = [
{"region": "亚太地区", "list": [
{"area": "日本东部 东京", "addr": "objectstorage.ap-tokyo-1.oraclecloud.com"},
{"area": "日本中部 大阪", "addr": "objectstorage.ap-osaka-1.oraclecloud.com"},
{"area": "韩国中部 首尔", "addr": "objectstorage.ap-seoul-1.oraclecloud.com"},
{"area": "韩国北部 春川", "addr": "objectstorage.ap-chuncheon-1.oraclecloud.com"},
{"area": "澳大利亚东部 悉尼", "addr": "objectstorage.ap-sydney-1.oraclecloud.com"},
{"area": "澳大利亚东南部 墨尔本", "addr": "objectstorage.ap-melbourne-1.oraclecloud.com"},
{"area": "印度西部 孟买", "addr": "objectstorage.ap-mumbai-1.oraclecloud.com"},
{"area": "印度南部 海得拉巴", "addr": "objectstorage.ap-hyderabad-1.oraclecloud.com"}
]
},
{"region": "北美地区", "list": [
{"area": "美国东部 阿什本", "addr": "objectstorage.us-ashburn-1.oraclecloud.com"},
{"area": "美国西部 凤凰城", "addr": "objectstorage.us-phoenix-1.oraclecloud.com"},
{"area": "美国西部 圣何塞", "addr": "objectstorage.us-sanjose-1.oraclecloud.com"},
{"area": "加拿大东南部 蒙特利尔", "addr": "objectstorage.ca-montreal-1.oraclecloud.com"},
{"area": "加拿大东南部 多伦多", "addr": "objectstorage.ca-toronto-1.oraclecloud.com"}
]
},
{"region": "欧洲地区", "list": [
{"area": "英国南部 伦敦", "addr": "objectstorage.uk-london-1.oraclecloud.com"},
{"area": "英国西部 加的夫", "addr": "objectstorage.uk-cardiff-1.oraclecloud.com"},
{"area": "德国中部 法兰克福", "addr": "objectstorage.eu-frankfurt-1.oraclecloud.com"},
{"area": "瑞士北部 苏黎世", "addr": "objectstorage.eu-zurich-1.oraclecloud.com"},
{"area": "荷兰西北部 阿姆斯特丹", "addr": "objectstorage.eu-amsterdam-1.oraclecloud.com"}
]
},
{"region": "中东地区", "list": [
{"area": "阿联酋东部 迪拜", "addr": "objectstorage.me-dubai-1.oraclecloud.com"},
{"area": "沙特阿拉伯西部 吉达", "addr": "objectstorage.me-jeddah-1.oraclecloud.com"}
]
},
{"region": "南美地区", "list": [
{"area": "巴西东部 圣保罗", "addr": "objectstorage.sa-saopaulo-1.oraclecloud.com"},
{"area": "智利中部 圣地亚哥", "addr": "objectstorage.sa-santiago-1.oraclecloud.com"}
]
}
]


def ping_check(addr):
from tcping import Ping
ping = Ping(addr)
ping.ping(10)

ret = ping.result.rows
for r in ret:
print(r)

ret = ping.result.raw
print(ret)

ret = ping.result.table
print(ret)


x = PrettyTable()

Statistics = namedtuple('Statistics', ["地域", "地区", "Host", "Minimum", "Average", "Maximum"])
x.field_names = Statistics._fields

for ls in lists:
region = ls.get("region")
for ds in ls.get("list"):
area = ds.get("area")
addr = ds.get("addr")
try:
res = ping(addr, count=10, verbose=False, out=None)
x.add_row(Statistics(region, area, addr, res.rtt_min_ms, res.rtt_avg_ms, res.rtt_max_ms))
except:
x.add_row(Statistics(region, area, addr, 0, 0, 0))

# ping_check(addr)

# x.align = "l"
x.padding_width = 5
print(x.get_string(sortby="Average", reversesort=False))
92 changes: 53 additions & 39 deletions rclone_expect_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,24 +30,27 @@ def run_cmd(cmd, popen=True, daemon=False, log_path="rclone.log"):
执行命令并根据参数决定是否在控制台输出执行结果
:param cmd: 执行的命令
:param popen: 是否回显,默认显示回显到控制台
:param daemon: 是否守护进程,默认不启用,当popen=True时才启用
:param log_path: 日志文件路径,在popen=False时启用
:param daemon: 是否守护进程(后台运行),默认不启用
:param log_path: 日志文件路径,在popen=False且daemon=True时启用
:return:
"""
if not popen: # 执行命令不输出回显并保存执行结果到日志文件(后台运行)
call = subprocess.call(f'nohup {cmd} >{log_path} &', shell=True)
if call != 0:
print(f"执行失败,请查看{log_path}中的日志")
if not popen:
if daemon:
# 执行命令不输出回显并保存执行结果到日志文件(后台运行)
call = subprocess.call(f'nohup {cmd} >{log_path} &', shell=True)
if call != 0:
print(f"执行失败,请查看{log_path}中的日志")
else:
print(subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False))
else: # 执行shell命令并实时输出回显
if daemon:
# 将当前进程fork为一个守护进程
pid = os.fork()
if pid > 0:
# 父进程退出
sys.exit(0)
# universal_newlines=True, bufsize=1
process = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
# universal_newlines=True, bufsize=1, stdin=subprocess.PIPE, stdout=subprocess.PIPE
process = subprocess.Popen(cmd, shell=True, stderr=subprocess.STDOUT)
# 判断子进程是否结束
while process.poll() is None:
line = process.stdout.readline()
Expand Down Expand Up @@ -81,34 +84,38 @@ def download_rclone():
download_url = asset["browser_download_url"]
# rclone压缩包名
zip_name = asset["name"]
if os.path.exists(zip_name):
# 删除同名压缩包
os.remove(zip_name)
# 解压后目录名
dir_name = zip_name.replace(".zip", "")
if os.path.exists(dir_name):

if not os.path.exists(zip_name):
# 删除同名压缩包
# os.remove(zip_name)

# 下载当前系统架构的文件
# 创建一个opener对象
opener = urllib.request.build_opener()
# 向opener传入请求头信息
opener.addheaders.append(('User-agent', user_agent))
# 将创建好的opener对象装入request
urllib.request.install_opener(opener)
filename, res = urllib.request.urlretrieve(download_url, zip_name)
# 从urlretrieve调用中清理临时文件
urllib.request.urlcleanup()
if not os.path.exists(filename):
raise Exception("rclone下载失败!")

if not os.path.exists(dir_name):
# 删除同名目录,防止目录中的文件已被删除
shutil.rmtree(dir_name)
# 下载当前系统架构的文件
# 创建一个opener对象
opener = urllib.request.build_opener()
# 向opener传入请求头信息
opener.addheaders.append(('User-agent', user_agent))
# 将创建好的opener对象装入request
urllib.request.install_opener(opener)
filename, res = urllib.request.urlretrieve(download_url, zip_name)
# 从urlretrieve调用中清理临时文件
urllib.request.urlcleanup()
if not os.path.exists(filename):
raise Exception("rclone下载失败!")
if zipfile.is_zipfile(zip_name):
# 解压
with zipfile.ZipFile(zip_name, "r") as zip_obj:
zip_obj.extractall(path=".")
# 授权:https://blog.csdn.net/u013632755/article/details/106599210
# os.chmod(dir_name, stat.S_IRWXO + stat.S_IRWXO + stat.S_IRWXO + stat.S_IRWXO)
subprocess.run(['chmod', "-R", "777", dir_name], universal_newlines=True, stdout=subprocess.PIPE,
stderr=subprocess.PIPE, shell=False)
# shutil.rmtree(dir_name)

if zipfile.is_zipfile(zip_name):
# 解压
with zipfile.ZipFile(zip_name, "r") as zip_obj:
zip_obj.extractall(path=".")
# 授权:https://blog.csdn.net/u013632755/article/details/106599210
# os.chmod(dir_name, stat.S_IRWXO + stat.S_IRWXO + stat.S_IRWXO + stat.S_IRWXO)
run_cmd(['chmod', "-R", "777", dir_name], popen=False)

return dir_name


Expand Down Expand Up @@ -335,21 +342,21 @@ def red_rclone_config(rclone_dir: str, name: str):
return conf, file


def write_one_drive_config(rclone_dir: str, name: str, type="onedrive", drive_type="business", token=None,
def write_one_drive_config(rclone_dir: str, name: str, type_="onedrive", drive_type="business", token=None,
drive_id=None):
"""
此函数是为了方便写入在其他地方已经授权复制过来的One Drive配置,而不需要重新创建配置
:param rclone_dir:
:param name: 自定义远程配置名称
:param type: drive类型,一般默认即可
:param type_: drive类型,一般默认即可
:param drive_type:
:param token: 授权token
:param drive_id:
:return:
"""
conf, file = red_rclone_config(rclone_dir, name)

conf.set(name, 'type', type)
conf.set(name, 'type', type_)
conf.set(name, 'drive_type', drive_type)
# conf.set(name, 'region', "global")
if token is not None:
Expand All @@ -361,12 +368,14 @@ def write_one_drive_config(rclone_dir: str, name: str, type="onedrive", drive_ty
conf.write(f)


def write_google_drive_config(rclone_dir: str, name: str, token=None, type="drive", scope="drive", team_drive=None,
def write_google_drive_config(rclone_dir: str, name: str, token=None, type_="drive", scope="drive", team_drive=None,
root_folder_id=None, shared_with_me=None, service_account_file=None, saf=None):
"""
此函数是为了方便写入在其他地方已经授权复制过来的Google Drive配置,而不需要重新创建配置
:param rclone_dir:
:param name: 自定义远程配置名称
:param token: 授权token
:param type_:
:param drive_type: drive类型,一般默认即可
:param scope: rclone从驱动器请求访问时应使用的范围,对应--drive-scope参数
:param team_drive: 团队驱动器的ID,对应--drive-team-drive参数
Expand All @@ -378,7 +387,7 @@ def write_google_drive_config(rclone_dir: str, name: str, token=None, type="driv
"""
conf, file = red_rclone_config(rclone_dir, name)

conf.set(name, 'type', type)
conf.set(name, 'type', type_)
conf.set(name, 'scope', scope)
if token is not None:
conf.set(name, 'token', token)
Expand Down Expand Up @@ -453,12 +462,17 @@ def write_google_drive_config(rclone_dir: str, name: str, token=None, type="driv

# 复制分享的链接文件或目录到团队盘
# run_cmd(f'./{rclone_dir}/rclone copy --drive-server-side-across-configs gdrive_stared: gdrive_team: {params}')

# 我的云盘同步到团队盘
# run_cmd(f'./{rclone_dir}/rclone sync --drive-server-side-across-configs gdrive: gdrive_team: {params}')

# 查看目录大小,可使用--drive-root-folder-id参数指定其他分享链接ID
# run_cmd(f'./{rclone_dir}/rclone size gdrive_stared: ')

# 通过服务账户授权,指定账户查看网盘大小
# run_cmd(f'./{rclone_dir}/rclone -v --drive-impersonate woytu.com@gmail.com size gservicedrive: ')

# 同步,排除参数--exclude "/{{images}}/" 只同步指定文件参数--include "/{{images}}/**"
run_cmd(f'./{rclone_dir}/rclone sync gdrive:/ onedrive:/ {params}')
# 去重
# run_cmd(f'./{rclone_dir}/rclone dedupe --dedupe-mode oldest gdrive:/ {params}')