Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 通过命令行有条件按键_Python_Macos_Command Line_Python 2.7_Osx Lion - Fatal编程技术网

Python 通过命令行有条件按键

Python 通过命令行有条件按键,python,macos,command-line,python-2.7,osx-lion,Python,Macos,Command Line,Python 2.7,Osx Lion,我正在建立一个测试用例,我想用按键启动或停止计时器,但我不知道如何让我的例程保持活力g'应启动计时器(并不断重复),s'应停止计时器然后,g'可以启动计时器,等等。相反,“g”启动计时器,“s”什么也不做。我做错了什么 代码: 尝试将循环移动到main函数中 def main(): result = 1 print 'starting time: ' , time.ctime() while(result): result = raw_input('press g to start timer,

我正在建立一个测试用例,我想用按键启动或停止计时器,但我不知道如何让我的例程保持活力g'应启动计时器(并不断重复),s'应停止计时器然后,g'可以启动计时器,等等。相反,“g”启动计时器,“s”什么也不做。我做错了什么

代码:


尝试将
循环移动到
main
函数中

def main():
result = 1
print 'starting time: ' , time.ctime()
while(result):
result = raw_input('press g to start timer, s to stop.\n')

if result is 'g':
    print_something()
    result = ''
elif result is 's':
    result = None
    time.stop()
    sys.exit()
更新:
您是否尝试过测试
while(result!=“s”)

您的主要问题是,您正在尝试从
标准输入中读取数据,但控制流被卡在
打印功能中(在本例中,这是一个无限循环),无法从那里离开。换句话说,您希望在用户输入时读取“s”,但在循环完成之前,该部分代码不会执行

您需要某种中断。下面的代码实现了您想要的功能,但是,用户必须按“Ctrl+C”停止计时器

#!/usr/bin/env python

import time, sys 

def main():
    result = 1 
    print 'starting time: ' , time.ctime()

    while(result):
        result = raw_input('press g to start timer, ctrl+c to stop.\n')

        if result is 'g':
            print_something()
            result = ''
        else:
            result = None
            time.stop()
            sys.exit()

def print_something():
    while 1:
        try:
            print 'the time: ' , time.ctime()
            time.sleep(1);
        except KeyboardInterrupt:            
            break
main()

编辑:

我想要的是:1。启动程序2。按g键,计时器启动3。打s,, 计时器停止4。点击g键,定时器启动等。CTRL-C键不应该是方式 停止计时器,而是终止程序


然后编程范式必须改变。您正在考虑一个响应按键等事件的。也许您需要创建一个线程,当另一个线程打印时间时,如果按下了
s
g
,该线程将检索按下的键,并相应地执行操作。

我尝试了此操作,但现在代码没有运行。我将更新我的问题。现在问题中对问题进行了更详细的描述。好的,假设我不想调用sys.exit(),只想停止计时器。我尝试了一下,但又无法打断。这是我试图解决的问题的核心。@jml从上面的代码中选择
sys.exit()
行只会停止计时器,您可以添加更多要从中执行的代码there@jml然后将
else:
更改为
elif结果为's':
,它将只执行
sys.exit()
从命令行获取
s
后(当然是在ctrl-c之后)@PALEN:以下是我想要的:1。启动程序2。按g键,计时器启动3。点击s,计时器停止4。点击g,定时器启动,等等。CTRL-C不应该是停止定时器的方式,而应该是终止程序。现在,我更新了我的问题,以便更清楚地说明这个问题。通过命令行操作您无法更新,因为在用户输入内容之前,屏幕不会更新(即不会打印任何内容)。换句话说,程序将一直等待用户输入,并且不会(持续)打印时间
#!/usr/bin/env python

import time, sys 

def main():
    result = 1 
    print 'starting time: ' , time.ctime()

    while(result):
        result = raw_input('press g to start timer, ctrl+c to stop.\n')

        if result is 'g':
            print_something()
            result = ''
        else:
            result = None
            time.stop()
            sys.exit()

def print_something():
    while 1:
        try:
            print 'the time: ' , time.ctime()
            time.sleep(1);
        except KeyboardInterrupt:            
            break
main()