【问题标题】:Loop to check if a variable has changed in Python循环检查 Python 中的变量是否已更改
【发布时间】:2017-05-27 21:15:41
【问题描述】:

我刚刚学习了 Python 的基础知识,我正在尝试做一些项目,以便增加我对编程语言的了解。

由于我比较偏执,我创建了一个脚本,它使用 PycURL 每 x 秒获取我当前的 IP 地址,以确保 VPN 安全。这是我的代码[已编辑]:

import requests

enterIP = str(input("What is your current IP address?"))

def getIP():
    while True:
        try:
             result = requests.get("http://ipinfo.io/ip")
             print(result.text)
        except KeyboardInterrupt:
             print("\nProccess terminated by user")
    return result.text

def checkIP():
    while True:
        if enterIP == result.text:
            pass
         else:
            print("IP has changed!")

getIP()
checkIP()

现在我想扩展这个想法,以便脚本要求用户输入他们当前的 IP,将该八位字节保存为字符串,然后使用循环继续针对 PycURL 函数运行它以确保他们的 IP没变?唯一的问题是我完全被难住了,我无法想出一个函数来获取 PycURL 的输出并将其与字符串进行比较。我怎样才能做到这一点?

【问题讨论】:

  • 一开始我使用的是一个函数,但是我遇到了一些错误,并且由于这个脚本的简单性,我现在不需要定义一个函数。
  • @sS5H 应该是相反的。你不需要为这样一个简单的函数定义一个类;)
  • @sS5H 你让它变得更糟了:D 你不需要两个循环。一个绰绰有余。您也不需要要求输入。只需在开始时检查一次并保存即可。然后运行循环并将其与第一个进行比较。

标签: python curl pycurl


【解决方案1】:

正如@holdenweb 解释的那样,您不需要pycurl 来完成如此简单的任务,但是,这里有一个工作示例:

import pycurl
import time
from StringIO import StringIO

def get_ip():
    buffer = StringIO()
    c = pycurl.Curl()
    c.setopt(pycurl.URL, "http://ipinfo.io/ip")
    c.setopt(c.WRITEDATA, buffer)
    c.perform()
    c.close()
    return buffer.getvalue()

def main():
    initial = get_ip()
    print 'Initial IP: %s' % initial

    try:
        while True:
            current = get_ip()
            if current != initial:
                print 'IP has changed to: %s' % current
            time.sleep(300)
    except KeyboardInterrupt:
        print("\nProccess terminated by user")

if __name__ == '__main__':
    main()

如您所见,我将获取 IP 的逻辑移至单独的函数:get_ip 并添加了一些缺失的内容,例如将缓冲区捕获到字符串并返回它。否则它与pycurl quickstart中的第一个示例几乎相同

main函数在下面调用,当脚本被直接访问(不是通过import)时。

首先,它调用get_ip 来获取初始IP,然后运行while 循环来检查IP 是否已更改并通知您是否更改。

编辑: 由于您更改了问题,因此这是一个工作示例中的新代码:

import requests

def getIP():
    result = requests.get("http://ipinfo.io/ip")
    return result.text

def checkIP():
    initial = getIP()
    print("Initial IP: {}".format(initial))
    while True:
        current = getIP()
        if initial == current:
            pass                                
        else:
            print("IP has changed!")

checkIP()

正如我在上面的 cmets 中提到的,您不需要两个循环。一个就够了。您甚至不需要两个功能,但最好这样做。一个用于获取数据,一个用于循环。在后面,先获取初始值,然后运行循环,在循环中检查值是否发生了变化。

【讨论】:

  • 我假设您使用的是 Python2,因为在 Python3 中修改了函数,我得到了很多错误?
  • 是的,你是对的。此示例假定使用 python 2,但保持相同的框架并更改为 py3 的函数和语法。更好的是,转储 pycurl 方法并使用 @holdenweb 指出的请求。不过,脚本的一般结构可以保持不变。
  • 在调整了一些东西之后,脚本运行良好。谢谢!
  • 很高兴听到,不客气。编辑了答案,因为您更改了问题。这次是py3。
【解决方案2】:

看来,通过阅读pycurl 文档,您会发现使用the requests library 更容易解决这个问题。 Curl 更多地与文件传输有关,因此该库希望您提供一个类似文件的对象,它将内容写入其中。这会使您的逻辑大大复杂化。

requests 允许您直接访问服务器响应的文本:

>>> import requests
>>> result = requests.get("http://ipinfo.io/ip")
>>> result.text
'151.231.192.8\n'

正如@PeterWood 所建议的,一个函数比一个类更适合这个 - 或者如果脚本要连续运行,只是一个简单的循环作为程序的主体。

【讨论】:

  • 谢谢,这看起来简单多了。我得到了这段代码来更简单地复制 PycURL。现在,我创建了两个函数:一个是请求循环,另一个是循环函数,以确保 IP 没有改变。然而,它只运行第一个功能。我是否需要使用线程才能同时运行这两个循环函数?
  • 如果你想同时做两件事,那么你有很多选择。线程可能是最简单的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-15
  • 2016-10-04
相关资源
最近更新 更多