正在做c扩展
This commit is contained in:
parent
f1bf94cc55
commit
d2e4c2f706
3
.gitignore
vendored
3
.gitignore
vendored
@ -149,5 +149,4 @@ dmypy.json
|
||||
other things/
|
||||
.git-/
|
||||
|
||||
try/cprint/cmake-build-debug
|
||||
try/c/cmake-build-debug
|
||||
*cmake-build-debug
|
||||
|
@ -26,7 +26,6 @@ from Difficult_Rocket import client, server
|
||||
from Difficult_Rocket.utils import tools
|
||||
from Difficult_Rocket.utils.translate import tr
|
||||
|
||||
|
||||
class Game:
|
||||
def __init__(self):
|
||||
# basic config
|
||||
|
19
Difficult_Rocket/utils/cprint/CMakeLists.txt
Normal file
19
Difficult_Rocket/utils/cprint/CMakeLists.txt
Normal file
@ -0,0 +1,19 @@
|
||||
cmake_minimum_required(VERSION 3.22)
|
||||
project(cprint VERSION 0.0.1 LANGUAGES C)
|
||||
# 环境
|
||||
set(CMAKE_BUILD_TYPE Debug)
|
||||
set(CMAKE_C_STANDARD 99)
|
||||
# 编译选项
|
||||
add_compile_options(-O3)
|
||||
add_compile_options(-Wall)
|
||||
add_compile_options(-Werror)
|
||||
#add_compile_options(-shared)
|
||||
#add_compile_options(-o ../../cprint.dll)
|
||||
# 加一下py3.8的 path
|
||||
include_directories(.)
|
||||
include_directories(C:\\Users\\shenjack.SHENJACK-5600X\\AppData\\Local\\Programs\\Python\\Python38\\include\\.)
|
||||
# 编译可执行
|
||||
#add_executable(cprint cprint.c)
|
||||
# 编译动态链接库
|
||||
#add_executable(cprint cprint.c)
|
||||
add_executable(py_cprint py_cprint.c)
|
66
Difficult_Rocket/utils/cprint/color_print.py
Normal file
66
Difficult_Rocket/utils/cprint/color_print.py
Normal file
@ -0,0 +1,66 @@
|
||||
import _winapi
|
||||
import subprocess
|
||||
import os
|
||||
|
||||
os.system('')
|
||||
|
||||
reset = '\033[0m'
|
||||
|
||||
print('A 000')
|
||||
|
||||
do = False
|
||||
|
||||
|
||||
def rgb(r, g, b):
|
||||
return 2, r, g, b
|
||||
|
||||
|
||||
# i_list = list(range(30, 39, 1))
|
||||
# # i_list = [39]
|
||||
# j_list = list(range(40, 49, 1))
|
||||
# # j_list = [49]
|
||||
#
|
||||
# for i in i_list:
|
||||
# for j in j_list:
|
||||
# print(f'\033[{i};{j}m{i}|{j} {reset}', end='|')
|
||||
# print()
|
||||
# print()
|
||||
|
||||
|
||||
def color_print(*args):
|
||||
args = [str(i) for i in args]
|
||||
out = '|'.join(args)
|
||||
line = ';'.join(args)
|
||||
print(f'\033[{line}m{out}\033[0m')
|
||||
|
||||
|
||||
if os.name == "nt":
|
||||
from ctypes import windll
|
||||
from ctypes.wintypes import BOOL, HANDLE, WORD
|
||||
|
||||
handle = _winapi.GetStdHandle(_winapi.STD_OUTPUT_HANDLE)
|
||||
kernel32 = windll.LoadLibrary("Kernel32.dll")
|
||||
SetConsoleAttribute = kernel32.SetConsoleTextAttribute
|
||||
SetConsoleAttribute.argtypes = (HANDLE, WORD)
|
||||
SetConsoleAttribute.restype = BOOL
|
||||
# FOREGROUND_INTENSITY|FOREGROUND_RED
|
||||
res: bool = SetConsoleAttribute(handle, 5)
|
||||
print(res)
|
||||
string = "Hello World!"
|
||||
_winapi.WriteFile(handle, string.encode("utf-8"), 0)
|
||||
else:
|
||||
pass
|
||||
|
||||
# exit(0)
|
||||
|
||||
color_print(94)
|
||||
color_print(41, 93)
|
||||
color_print(36, 40)
|
||||
print()
|
||||
color_print(48, *rgb(200, 100, 20), 34)
|
||||
color_print(48, *rgb(255, 161, 72))
|
||||
color_print(48, *rgb(255, 161, 72), 38, *rgb(1, 50, 255))
|
||||
color_print(48, *rgb(178, 112, 50), 38, *rgb(98, 96, 167))
|
||||
print()
|
||||
color_print(48, *rgb(100, 10, 10), )
|
||||
exit(0)
|
11
Difficult_Rocket/utils/cprint/colors.py
Normal file
11
Difficult_Rocket/utils/cprint/colors.py
Normal file
@ -0,0 +1,11 @@
|
||||
# -------------------------------
|
||||
# Difficult Rocket
|
||||
# Copyright © 2021-2022 by shenjackyuanjie 3695888@qq.com
|
||||
# All rights reserved
|
||||
# -------------------------------
|
||||
from colorama import Fore, Back, Style
|
||||
print(Fore.RED + 'some red text')
|
||||
print(Back.GREEN + 'and with a green background')
|
||||
print(Style.DIM + 'and in dim text')
|
||||
print(Style.RESET_ALL)
|
||||
print('back to normal now')
|
41
Difficult_Rocket/utils/cprint/compile.py
Normal file
41
Difficult_Rocket/utils/cprint/compile.py
Normal file
@ -0,0 +1,41 @@
|
||||
|
||||
import os
|
||||
|
||||
# include 目录
|
||||
include_paths = ["C:\\Users\\shenjack.SHENJACK-5600X\\AppData\\Local\\Programs\\Python\\Python38\\include\\."]
|
||||
|
||||
# 编译选项
|
||||
compile_options = {
|
||||
"-shared": None,
|
||||
"-O3": None,
|
||||
"-Wall": None,
|
||||
"-Werror": None,
|
||||
"-o": "./py_cprint.dll"
|
||||
}
|
||||
|
||||
include_command = "-I "
|
||||
|
||||
# 处理 include 目录命令
|
||||
for path in include_paths:
|
||||
include_command = "{}, {}".format(include_command, path)
|
||||
else:
|
||||
if len(include_paths) != 0:
|
||||
include_command = include_command[:3] + include_command[4:]
|
||||
|
||||
compile_option_command = ""
|
||||
|
||||
# 处理编译选项
|
||||
for option, key in compile_options.items():
|
||||
if key is None:
|
||||
compile_option_command = "{} {} ".format(compile_option_command, option)
|
||||
else:
|
||||
compile_option_command = "{} {} {}".format(compile_option_command, option, key)
|
||||
|
||||
print(include_command, compile_option_command)
|
||||
|
||||
compile_command = "gcc.exe ./py_cprint.c {}{}".format(include_command, compile_option_command)
|
||||
|
||||
print(compile_command)
|
||||
|
||||
os.system(compile_command)
|
||||
|
30
Difficult_Rocket/utils/cprint/cprint.c
Normal file
30
Difficult_Rocket/utils/cprint/cprint.c
Normal file
@ -0,0 +1,30 @@
|
||||
//
|
||||
// Created by shenjack on 2022/6/24.
|
||||
//
|
||||
|
||||
//#define PY_SSIZE_T_CLEAN
|
||||
#include "Python.h"
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
|
||||
int CcPrint(PyObject *self, PyObject *args, PyObject *kwargs){
|
||||
char *print_str;
|
||||
char *line_end = NULL; // 准备参数
|
||||
static char *kwlist[] = {"some_stuf", "end", NULL}; // 准备参数列表
|
||||
if(!PyArg_ParseTupleAndKeywords(args, kwargs, "ss", kwlist, &print_str, &line_end)){
|
||||
return 0;
|
||||
};
|
||||
return 1;
|
||||
};
|
||||
|
||||
// 如果你非得调用我·····
|
||||
int main(){
|
||||
printf("aaaa");
|
||||
if(false){
|
||||
CcPrint(PyLong_FromLong(1), PyLong_FromLong(1), PyLong_FromLong(1));
|
||||
};
|
||||
return 0;
|
||||
};
|
9
Difficult_Rocket/utils/cprint/dll_load.py
Normal file
9
Difficult_Rocket/utils/cprint/dll_load.py
Normal file
@ -0,0 +1,9 @@
|
||||
|
||||
from objprint import objprint
|
||||
|
||||
from ctypes import cdll
|
||||
|
||||
cprint = cdll.LoadLibrary("./cprint.dll")
|
||||
|
||||
# objprint(cprint)
|
||||
|
44
Difficult_Rocket/utils/cprint/py_cprint.c
Normal file
44
Difficult_Rocket/utils/cprint/py_cprint.c
Normal file
@ -0,0 +1,44 @@
|
||||
//
|
||||
// Created by shenjack on 2022/7/6.
|
||||
//
|
||||
|
||||
#define PY_SSIZE_T_CLEAN
|
||||
#include <Python.h>
|
||||
#include <stdint.h>
|
||||
|
||||
static PyObject *pycprint_print(PyObject *self, PyObject *args){
|
||||
const char *text;
|
||||
if(!PyArg_ParseTuple(args, "s", &text)){ // 解析 text
|
||||
return NULL;
|
||||
};
|
||||
printf("%s", text);
|
||||
Py_RETURN_NONE;
|
||||
};
|
||||
|
||||
static PyObject *pycpint_printf(PyObject *self, PyObject *args, PyObject *kwargs){
|
||||
PyObject *a;
|
||||
if(!PyArg_ParseTuple(args, "O", &a)){
|
||||
return NULL;
|
||||
};
|
||||
Py_ssize_t text_len = PyTuple_Size(args);
|
||||
Py_RETURN_NONE;
|
||||
};
|
||||
|
||||
static PyMethodDef PyCprintMethods[] = {
|
||||
{"print", pycprint_print, METH_VARARGS, "直接使用c的printf输出"},
|
||||
{"printf", (PyCFunction)(void(*))pycpint_printf, METH_VARARGS | METH_KEYWORDS,
|
||||
"传入类似py print然后进行format的print"},
|
||||
{NULL, NULL, 0, NULL}
|
||||
};
|
||||
|
||||
static struct PyModuleDef pycprintmodule = {
|
||||
PyModuleDef_HEAD_INIT,
|
||||
"pycprint",
|
||||
"直接调用c的printf",
|
||||
-1,
|
||||
PyCprintMethods
|
||||
};
|
||||
|
||||
PyMODINIT_FUNC PyInit_pycprint(void){
|
||||
return PyModule_Create(&pycprintmodule);
|
||||
}
|
9
Difficult_Rocket/utils/cprint/py_cprint.py
Normal file
9
Difficult_Rocket/utils/cprint/py_cprint.py
Normal file
@ -0,0 +1,9 @@
|
||||
# -------------------------------
|
||||
# Difficult Rocket
|
||||
# Copyright © 2021-2022 by shenjackyuanjie 3695888@qq.com
|
||||
# All rights reserved
|
||||
# -------------------------------
|
||||
|
||||
from build import pycprint
|
||||
|
||||
pycprint.print("aaa\n")
|
7
Difficult_Rocket/utils/cprint/pycprint.pyi
Normal file
7
Difficult_Rocket/utils/cprint/pycprint.pyi
Normal file
@ -0,0 +1,7 @@
|
||||
# -------------------------------
|
||||
# Difficult Rocket
|
||||
# Copyright © 2021-2022 by shenjackyuanjie 3695888@qq.com
|
||||
# All rights reserved
|
||||
# -------------------------------
|
||||
|
||||
def print(text: str) -> None: ... # 直接调用fprint
|
30
Difficult_Rocket/utils/cprint/setup.py
Normal file
30
Difficult_Rocket/utils/cprint/setup.py
Normal file
@ -0,0 +1,30 @@
|
||||
from setuptools import setup, Extension
|
||||
import shutil
|
||||
import os
|
||||
|
||||
pycprint = Extension('pycprint',
|
||||
sources=['py_cprint.c'])
|
||||
|
||||
setup(name='PyCprint',
|
||||
version='0.0.1',
|
||||
author='shenjack',
|
||||
author_email='3695888@qq.com',
|
||||
description='这是一个用于直接调用c的printf的库',
|
||||
ext_modules=[pycprint])
|
||||
|
||||
|
||||
def dir_not_temp(path: str):
|
||||
return path.find('temp') and os.path.isdir(os.path.join('build', path))
|
||||
|
||||
|
||||
build_dir = os.listdir('./build')
|
||||
build_dir = list(filter(dir_not_temp, build_dir))
|
||||
# 用列表推导式把 是文件夹 且 名字里没有 temp 的抽出来
|
||||
print(build_dir)
|
||||
|
||||
os.chdir('build')
|
||||
# 把运行路径迁移过去,方便copy
|
||||
|
||||
for build in build_dir:
|
||||
copy = os.listdir(build)
|
||||
shutil.copy(os.path.join(build, copy[0]), './')
|
BIN
docs/字体展示.pptx
BIN
docs/字体展示.pptx
Binary file not shown.
@ -25,16 +25,24 @@ DEBUG = 10
|
||||
NOTSET = 0
|
||||
"""
|
||||
|
||||
DETAIL = 5
|
||||
|
||||
|
||||
|
||||
class LogFileCache:
|
||||
"""日志文件缓存"""
|
||||
|
||||
def __init__(self, file_name: str = 'logs//log.log', flush_time: Optional[Union[int, float]] = 1, cache_entries_num: int = 10):
|
||||
def __init__(self, file_name: str = 'logs//log.log', flush_time: Optional[Union[int, float]] = 1, log_cache_lens_max: int = 10):
|
||||
"""
|
||||
|
||||
@param file_name: 日志文件名称
|
||||
@param flush_time: 刷新日志缓存,写入文件的时长间隔
|
||||
@param log_cache_lens_max: 日志缓存在自动写入前的最大缓存长度
|
||||
"""
|
||||
# 配置相关
|
||||
self._logfile_name = file_name # log 文件名称
|
||||
self.flush_time = flush_time # 缓存刷新时长
|
||||
self.cache_entries_num = cache_entries_num
|
||||
self.cache_entries_num = log_cache_lens_max
|
||||
# 写入缓存数
|
||||
self.cache_count = 0
|
||||
# 日志缓存表
|
||||
@ -45,6 +53,7 @@ class LogFileCache:
|
||||
self.threaded_write = threading.Timer(1, self._log_file_time_write)
|
||||
|
||||
def end_thread(self):
|
||||
"""结束日志写入进程,顺手把目前的缓存写入"""
|
||||
self.thread_lock.acquire(blocking=True)
|
||||
self.threaded_write.cancel()
|
||||
if self.cache_count:
|
||||
@ -66,7 +75,6 @@ class LogFileCache:
|
||||
def _log_file_time_write(self) -> None:
|
||||
"""使用 threading.Timer 调用的定时写入日志文件的函数"""
|
||||
with self.with_thread_lock:
|
||||
...
|
||||
if self.cache_count == 0:
|
||||
return None
|
||||
...
|
||||
@ -93,7 +101,7 @@ class Logger:
|
||||
else:
|
||||
...
|
||||
|
||||
def make_log(self, level: str,
|
||||
def make_log(self, level: int,
|
||||
*values: object,
|
||||
sep: Optional[str] = ' ',
|
||||
end: Optional[str] = '\n',
|
||||
@ -104,61 +112,45 @@ class Logger:
|
||||
sep: Optional[str] = ' ',
|
||||
end: Optional[str] = '\n',
|
||||
flush: Optional[bool] = False) -> None:
|
||||
self.make_log(level='detail', *values, sep=sep, end=end, flush=flush)
|
||||
self.make_log(level=DETAIL, *values, sep=sep, end=end, flush=flush)
|
||||
|
||||
def debug(self,
|
||||
*values: object,
|
||||
sep: Optional[str] = ' ',
|
||||
end: Optional[str] = '\n',
|
||||
flush: Optional[bool] = False) -> None:
|
||||
...
|
||||
self.make_log(level=DEBUG, *values, sep=sep, end=end, flush=flush)
|
||||
|
||||
def info(self,
|
||||
*values: object,
|
||||
sep: Optional[str] = ' ',
|
||||
end: Optional[str] = '\n',
|
||||
flush: Optional[bool] = False) -> None:
|
||||
...
|
||||
self.make_log(level=INFO, *values, sep=sep, end=end, flush=flush)
|
||||
|
||||
def warning(self,
|
||||
*values: object,
|
||||
sep: Optional[str] = ' ',
|
||||
end: Optional[str] = '\n',
|
||||
flush: Optional[bool] = False) -> None:
|
||||
...
|
||||
self.make_log(level=WARNING, *values, sep=sep, end=end, flush=flush)
|
||||
|
||||
def error(self,
|
||||
*values: object,
|
||||
sep: Optional[str] = ' ',
|
||||
end: Optional[str] = '\n',
|
||||
flush: Optional[bool] = False) -> None:
|
||||
...
|
||||
self.make_log(level=ERROR, *values, sep=sep, end=end, flush=flush)
|
||||
|
||||
def fatal(self,
|
||||
*values: object,
|
||||
sep: Optional[str] = ' ',
|
||||
end: Optional[str] = '\n',
|
||||
flush: Optional[bool] = False) -> None:
|
||||
...
|
||||
self.make_log(level=FATAL, *values, sep=sep, end=end, flush=flush)
|
||||
|
||||
|
||||
# class LoggerManager:
|
||||
# """shenjack牌logger"""
|
||||
#
|
||||
# def __init__(self):
|
||||
# self.configs = {}
|
||||
#
|
||||
# def add_config(self, name: str, config: dict) -> dict:
|
||||
# self.configs[name] = config
|
||||
# return self.configs
|
||||
#
|
||||
# def get_logger(self, name: str = 'root', config: dict = None) -> Logger:
|
||||
# """相当于 logging.getLogger(name='root')"""
|
||||
# if config is not None:
|
||||
# self.add_config(name, config)
|
||||
# return Logger(config=self.configs)
|
||||
|
||||
global_configs = {
|
||||
logger_configs = {
|
||||
'root': {
|
||||
'level': DEBUG,
|
||||
'color': {
|
||||
@ -171,3 +163,24 @@ global_configs = {
|
||||
...: ...
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
def add_dict_config_to_global(some_dict: dict, name: str) -> dict:
|
||||
"""
|
||||
|
||||
@param some_dict: 一个你丢进来的 logger 设置
|
||||
@param name: 这个 logger 设置的名称
|
||||
@return: 修改过的 logger 配置
|
||||
"""
|
||||
logger_configs[name] = some_dict
|
||||
return logger_configs
|
||||
|
||||
|
||||
def add_kwargs_to_global(**kwargs) -> dict:
|
||||
"""
|
||||
|
||||
@param kwargs:
|
||||
@return:
|
||||
"""
|
||||
...
|
||||
|
||||
|
@ -1,12 +0,0 @@
|
||||
# -------------------------------
|
||||
# Difficult Rocket
|
||||
# Copyright © 2021-2022 by shenjackyuanjie
|
||||
# All rights reserved
|
||||
# -------------------------------
|
||||
|
||||
"""
|
||||
writen by shenjackyuanjie
|
||||
mail: 3695888@qq.com
|
||||
github: @shenjackyuanjie
|
||||
gitee: @shenjackyuanjie
|
||||
"""
|
@ -1,12 +0,0 @@
|
||||
# -------------------------------
|
||||
# Difficult Rocket
|
||||
# Copyright © 2021-2022 by shenjackyuanjie
|
||||
# All rights reserved
|
||||
# -------------------------------
|
||||
|
||||
"""
|
||||
writen by shenjackyuanjie
|
||||
mail: 3695888@qq.com
|
||||
github: @shenjackyuanjie
|
||||
gitee: @shenjackyuanjie
|
||||
"""
|
@ -1,32 +0,0 @@
|
||||
# -------------------------------
|
||||
# Difficult Rocket
|
||||
# Copyright © 2021 by shenjackyuanjie
|
||||
# All rights reserved
|
||||
# -------------------------------
|
||||
|
||||
"""
|
||||
writen by shenjackyuanjie
|
||||
mail: 3695888@qq.com
|
||||
github: @shenjackyuanjie
|
||||
gitee: @shenjackyuanjie
|
||||
"""
|
||||
|
||||
"""
|
||||
this is a test of modding in Difficult Rocket
|
||||
just a test
|
||||
只是一个DR的mod测试
|
||||
"""
|
||||
|
||||
# from libs
|
||||
import semver
|
||||
|
||||
# from DR
|
||||
from Difficult_Rocket import semver_game_version
|
||||
from Difficult_Rocket.mods import MODInfo, semver_loader_version
|
||||
|
||||
mod_info = MODInfo(name="test mod",
|
||||
version=semver.VersionInfo.parse("0.0.1"),
|
||||
write_version=semver_game_version,
|
||||
write_loader_version=semver_loader_version)
|
||||
|
||||
print(mod_info.serialize())
|
Loading…
Reference in New Issue
Block a user