Python命令行程序调用单个方法时所有方法均执行的问题排查
问题原因分析
你遇到的核心问题是字典初始化时提前执行了所有方法调用。在commands.py的COMMANDS字典里,你写的是"help" : modules.help()这种带括号的形式——这种写法会在字典创建的瞬间就执行对应的方法,而不是等用户输入命令后再触发。这就导致程序一启动,find_time()里的print("Nothing")、input_new_log()里的输入框就先跑出来了,完全不受用户输入的控制。
另外还有个小问题:"find- time"对应的modules.find_time(user)里的user参数,和modules.py中find_time()的无参数定义不匹配,这会导致调用时直接报错,需要一并修正。
解决办法
我们需要把字典里的值改成方法本身(不调用),等用户输入命令后,再取出方法并执行它。具体步骤如下:
1. 修正commands.py的字典定义和执行逻辑
把COMMANDS字典里的方法调用(带括号)改成方法引用(不带括号),然后在execute方法中拿到方法后再执行:
from modules import * class commands(object): def execute(user_input): # 现在字典存的是方法本身,不是执行结果 COMMANDS = { # || GENERAL || "help" : modules.help, # || FIND || "find- time" : modules.find_time, # 去掉多余的user参数 "find- date" : modules.find_date, # || INPUT || "input- log: new" : modules.input_new_log } try: # 取出对应的方法 target_func = COMMANDS[user_input] # 这里才执行方法 execution = target_func() return execution except KeyError: return "ERROR --> No such command"
2. 修正modules.py的参数不匹配问题
确保find_time的方法签名和调用逻辑一致:
import datetime class modules(object): # -- || GENERAL MODULES || --- def help(): return "Action terms:\n'find'\n'input'" + "\n__________\n" # --- || 'FIND' MODULES || --- def find_time(): print("Nothing") return datetime.datetime.now().time() def find_date(): return datetime.datetime.now().date() # --- || 'INPUT' MODULES || --- def input_new_log(): new_user_log = input("> ") path = 'C:\\Users\\Guppy\\Projects\\RACHEAL\\RACHEALs Databases\\user_log.txt' with open(path, 'w') as log: log.write(new_user_log) input_new_log_exit_code = 1 return "EXIT CODE = " + str(input_new_log_exit_code)
3. 测试验证
现在运行rcmd.py,输入find- date后,就会得到你期望的输出:
Guppy\RACHEAL> find- date FINISHED --> 2017-12-31
(注:这里修正了日期格式,datetime会自动输出合法的年-月-日格式,你原来的2017-31-12是无效格式)
内容的提问来源于stack exchange,提问作者guppythegod
相关产品推荐
相关产品推荐

