循环检查 Python 中的变量是否已更改

Loop to check if a variable has changed in Python

我刚刚学习了 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 的输出并将其与字符串进行比较。我怎样才能做到这一点?

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

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

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

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

正如@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 函数。

首先,它调用 get_ip 获取初始 IP,然后 运行s 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()

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