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

2024-05-14 00:28:07 发布

您现在位置: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的输出并将其与字符串进行比较。我怎么做到的?在


Tags: 函数字符串textip脚本truedefresult
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是否已更改并通知您是否已更改。在

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

^{pr2}$

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

从阅读pycurl文档来看,您似乎会发现使用the ^{} library来解决这个问题会更容易。Curl更多地用于文件传输,因此库希望您提供一个类似文件的对象,它将内容写入其中。这会使你的逻辑复杂化。在

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

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

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

相关问题 更多 >