python - 如何编写 Python 代码来支持 Windows 和 Linux?
问题描述
我有一些代码需要在 Windows 和 Linux 上做非常相似的事情。不幸的是,我需要几个特定于系统的功能(例如隐藏文件:Python 跨平台隐藏文件)。编写代码以提高可读性和可维护性的最佳方式是什么?
目前,代码使用许多if
语句在不同平台上表现不同。我考虑过的另一种方法是将代码拆分为两个单独的函数,一个用于 Windows,一个用于 Linux,但这意味着在两个地方更新代码的主要部分。
请注意,代码的主要部分比这要长得多且复杂得多。
组合方法(最大的可维护性,但有很多if
语句):
import os
def sort_out_files():
if is_linux:
do_linux_preparations()
else:
do_windows_preparations()
# Main part of the code:
for file in os.listdir(folder):
if is_correct_file(file):
if is_linux:
do_main_actions_for_linux()
else:
do_main_actions_for_windows()
if is_linux:
do_linux_tidying_up()
else:
do_windows_tidying_up()
单独的方法(需要更多维护但需要更少的if
语句):
import os
def sort_out_files_linux():
do_linux_preparations()
# Main part of the code:
for file in os.listdir(folder):
if is_correct_file(file):
do_main_actions_for_linux()
do_linux_tidying_up()
def sort_out_files_windows():
do_windows_preparations()
# Main part of the code:
for file in os.listdir(folder):
if is_correct_file(file):
do_main_actions_for_windows()
do_windows_tidying_up()
def sort_out_files():
if is_linux:
sort_out_files_linux():
else:
sort_out_files_windows()
和功能涉及复制文件do_preparations()
,do_tidying_up()
提取等。
is_correct_file()
检查文件是否具有正确的名称和正确的时间戳。
do_main_actions()
涉及分析、移动和隐藏文件。
上面的例子都有效,但似乎不是最 Pythonic 或长期代码可维护性的最佳方法。
解决方案
我会将仅适用于一个操作系统的所有内容放在一个文件中,但名称相同。然后你可以在你的主文件的开头添加这样的东西:
if is_linux:
import linux_tools as tools
else:
import windows_tools as tools
如果这两个文件具有相同的接口(例如顶级方法),它们可以互换使用。
在您的示例中,linux_tools
andwindows_tools
都将包含它们各自的实现sort_out_files
,但都命名为sort_out_files
,因此您可以将其与tools.sort_out_files
.
请记住在这些模块中保留尽可能多的通用代码。
推荐阅读
- c# - 使用 C# 启动文件
- python - 如何在 wordpress 网站的后台运行 python 脚本
- php - 获取临时凭据时收到带有消息“{“errors”:[{“code”:32,“message”:“无法验证您。”}]}“的HTTP状态代码[401]
- algorithm - 查找单词字谜数量的算法?
- android - Ionic 与 SwiperJS 的幻灯片在 Android 上是生涩的。在 iOS 和网络上都很好
- laravel - Laravel Fortify :: 通过 Livewire 调用 `updatePassword()` 函数
- java - 为什么错误 javax.jms.InvalidDestinationException:不允许创建目的地?使用 Spring Boot 应用程序向 MQ 发送消息的问题
- r - 使用 R 行上的逻辑运算符向列添加值
- swift - 为什么我会收到快速错误“参数传递给不带参数的调用”
- elasticsearch - 具有范围和 match_phrase 的聚合