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

时间:2017-05-27 21:15:42

标签: python curl pycurl

我刚刚学习了Python的基础知识,并且我正在尝试创建一些项目,这样我就可以增加对编程语言的了解。

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

(g x)

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

2 个答案:

答案 0 :(得分:2)

正如@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,然后运行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()

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

答案 1 :(得分:1)

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

requests可让您直接访问服务器响应的文本:

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

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