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