我正在尝试从我的 python 脚本中发送一个可执行文件,该脚本位于使用 pipenv 的虚拟环境中,它再次依赖 pyenv 进行 python 版本控制。为此,我想要我们 pyinstaller。
我做了什么:
pipenv install pyinstaller
pyinstaller --onefile my_script.py
Run Code Online (Sandbox Code Playgroud)
输出:
40 INFO: PyInstaller: 3.5
40 INFO: Python: 3.6.9
41 INFO: Platform: Linux-4.15.0-65-generic-x86_64-with-debian-stretch-sid
42 INFO: wrote /home/matthaeus/cybathlon/planvec/qt_video_gui_example.spec
44 INFO: UPX is not available.
45 INFO: Extending PYTHONPATH with paths
['/home/matthaeus/cybathlon/planvec', '/home/matthaeus/cybathlon/planvec']
45 INFO: checking Analysis
45 INFO: Building Analysis because Analysis-00.toc is non existent
45 INFO: Initializing module dependency graph...
46 INFO: Initializing module graph hooks...
47 INFO: Analyzing base_library.zip ...
2786 INFO: …Run Code Online (Sandbox Code Playgroud) 处理我想将异常记录到控制台、文件等然后终止程序的情况的最佳方法是什么?假设我读入配置并验证给出的条目是否有意义。如果没有,我想引发 InvalidConfigError,记录此错误并终止,因为无法从中恢复。
try:
config = validate_config(read_config(cfg_file_path))
except InvalidConfigError:
logging.getLogger(__name__).exception(f'Config validation failed.')
exit(1)
Run Code Online (Sandbox Code Playgroud)
当我这样做时(注意raise)
try:
config = validate_config(read_config(cfg_file_path))
except InvalidConfigError:
logging.getLogger(__name__).exception(f'Config validation failed.')
raise
Run Code Online (Sandbox Code Playgroud)
由于我记录了整个事件(包括),因此我将在控制台日志中获得重复的回溯。我的异常日志记录调用中的回溯,然后再次引发它,这将再次打印整个内容。
有一个更好的方法吗?我觉得 exit(1) 不是特别好。
version: 1
disable_existing_loggers: False
formatters:
simple:
format: "%(asctime)s : %(name)-12s : %(levelname)-10s %(message)s"
handlers:
console:
class: logging.StreamHandler
level: DEBUG
formatter: simple
stream: ext://sys.stdout
info_file_handler:
class: logging.handlers.RotatingFileHandler
level: INFO
formatter: simple
filename: data/logs/info.log
maxBytes: 10485760 # 10MB
backupCount: 5
encoding: utf8
error_file_handler:
class: logging.handlers.RotatingFileHandler
level: ERROR
formatter: simple …Run Code Online (Sandbox Code Playgroud) 我有一个函数,它接受一个指向const double数组的const指针,在该数组上我使用大小作为my_func内的边界检查进行循环。
在.h中声明
void my_func(const double * const my_array, size_t size);
Run Code Online (Sandbox Code Playgroud)
在.c中实现
void my_func(const double * const my_array, size_t size) {
for (size_t idx = 0; idx < size; idx++) {
do_something_with(my_array[idx]);
}
}
Run Code Online (Sandbox Code Playgroud)
我不希望在函数内部更改指针,从而使其成为现实* const。我不希望它指向的数据被更改,因此const double。
但是Clang-Tidy希望我让函数声明将const放到指针上,使其变为
void my_func(const double * my_array, size_t size);
Run Code Online (Sandbox Code Playgroud)
Clang-Tidy:参数'my_array'在函数声明中是const限定的;参数的const限定仅在函数定义中起作用
如果我遵循该建议,但又希望保持上面的约束,那么我的函数声明和定义将不再相同。
1)
假设我的指针参数不是const(const double * pointer_arg),如果我pointer_arg在函数内部进行更改以指向另一个const double,则该更改在函数外部是否可见?也就是说,在执行完我的函数的那一行之后,填充pointer_arg指向何处?如果看不见,是否表示指针已按值复制?这有可能吗?
2)
声明声明中的const无效的决定背后的原因是什么?
3)
在声明和定义中使用不同的函数签名可能会有什么好处?对我来说,看我的头文件还不清楚实现的工作原理,函数内部是否为const,不是吗?这让我或代码合作者感到困惑。
4)
我应该在声明中删除const吗?什么是最好的做法,在这种情况下?