Python 常见问题总结

1 错误:No module named '_tkinter'

如果在使用类似 matplotlib 库时遇到如下错误:

因为事实上 tkinter 并不是一个第三方库,而是 Python 的内置接口类,并不能使用 pip3 来进行安装。
可尝试使用以下方法解决:

1)安装 python-tk 和 tk-dev 库:

2)重新编译 Python 3.6.5:
进入 Python 3.6.5 源码目录,运行如下命令:

3)如果正确安装则可以运行:

2 错误:ModuleNotFoundError: No module named 'pandas'

在安装 Python 3.6 以后可能会遇到如下问题:

通常情况下只需要运行:

不过在 Python 3.6 时,如果你之前装了其他版本比如 3.5 版本的 Python,可能运行后直接安装到 Python 3.5 的目录下,3.6 仍然没有安装。这时可以使用以下命令安装在指定版本上:

3 错误:_tkinter.TclError: couldn't connect to display "localhost:11.0"

如果在使用 SSH 远端调用 matlibplot 等显示界面时遇到如下错误:

可能有几个问题,请检查:
1)SSH 连接方式,请使用 -X 参数:
ssh -X user@webserver.com

2)MacOS 请安装 XQuartz 后重启再尝试(参见[2])。

4 子目录 import 根目录路径

如果你的在子目录有一个 python 脚本,类似 tests/test.py 希望 import 根目录的 load_data.py ,一个可行的方法就是在 test.py 文件头部加入:

然后正常 import 方式类似:

运行时在根目录运行:

5 处理多进程 apply_async 中的 error

在使用 apply_async 函数进行异步多线程处理时,如果线程内部报错,在主线程中是不会显示的,这样会给调试带来很大不便。一个较好的方式是使用其 error_callback 参数获取错误并进行处理(显示调用栈等)。
方法如下:

定义 error_handler 函数:

将其作为参数传入:

报错时会输出如下类似信息:

参考 [3]

6 处理多进程中的通信

在 Python 中如果想要在进程之间共享变量,使用 global 全局变量或者变量域的方式并不太可行[4]。比如如下代码:

实际上输出是空:

而我们想要的是能够连接两个 list 的输出。一个比较好的方法是使用 Manager 来管理进程间的变量,声明变量时使用 Manager 中的相应函数,只需简单修改成如下代码:

再次运行输出就变成了:

这就是我们想要的输出了。
当然 Manager 不仅可以定义 list 还有很多变量类型例如:
list, dict, Namespace, Lock, RLock, Semaphore, BoundedSemaphore, Condition, Event, Barrier, Queue, Value and Array
我们可以进行想要的定义。

7 正确提前终止 Pool 中的多进程

在使用多进程并发时,如果想要在某个进程内部提前终止所有进程,一个比较好的方法是使用 Manager 中的 Event 来进行控制。
一个典型示例如下:

在上述例子中,我们没有使用通常使用的 p.join() 而是用 event.wait() 。这一函数的目的是在没有产生 event.set() 调用之前运行当前 pool 中的所有 worker,当你触发停止条件时,只需调用 event.set() 则整个 pool 中的 Process 都被停止,最后只需调用 p.terminate() 终止所有进程即可。

8 在 main 函数中正确退出整个程序

在 main 函数中退出整个程序较好的方式是使用 SystemExit。
一个示例如下:

9 错误 zipfile.BadZipfile: Truncated file header

出现上述错误如果排除 zip 文件损坏情况,可以考虑是不是有多线程冲突。因为 zipfile 是非线程安全的,如果再多线程中使用,应该加锁。

10 Python 中多文件全局变量的实现

首先创建如下文件并保存为 global_var.py:

使用方法如下,其中 gvar._init_() 只需要在 main 函数中调用一次即可:

11 Python 中字符串相等判断

在 Python 中判断两个变量是否相等可以用 == 或者 is,但是判断字符串是否相等 只能用 ==。

例如下面的例子:

其输出为:

可见采用 is 判断字符串是否相同时就出现了错误。
其原因是,对于 is 来说判断的是二者是不是同一个对象,比如相同的字符串是同一个对象,例如都是 'aa',但如果不同的字符串就不是同一个对象,即使而这内容相等,例如 'aa.bb' 中前两个字节的 'aa' 与字符串 'aa' 显然不是同一个对象,但二者内容实际上是相等的。例如如下代码:

其输出就为:

参考文献

[1] https://blog.csdn.net/blueheart20/article/details/78763208
[2] https://wikis.nyu.edu/display/ADRC/Enable+X11+Forwarding+on+Mac+OS+X
[3] https://stackoverflow.com/questions/28595234/python3-how-to-find-out-which-line-in-apply-async-target-function-caused-error-w
[4] https://blog.ruanbekker.com/blog/2019/02/19/sharing-global-variables-in-python-using-multiprocessing/
[5] https://blog.csdn.net/qq_41037945/article/details/104365445
[6] http://www.download2me.com/article/396304.html

One Comment

Add a Comment

您的电子邮箱地址不会被公开。 必填项已用 * 标注