Python 脚本停止写入但显示为 运行 进程
Python script stops writing but in shown as a running process
我是 运行 linux 服务器屏幕上的 python 脚本,当我执行 TOP 命令时我可以看到它 运行 但已经好几个小时了该脚本没有写任何东西。有人知道可能是什么原因吗?
这是我的脚本:
import GeoIP
from netaddr import *
gi = GeoIP.GeoIP("/data/GeoIPOrg_20141202.dat", GeoIP.GEOIP_MEMORY_CACHE)
o = Path to the output text file
for line in f:
line = line.strip('\n')
asn,ip,count =line.split('|')
org = gi.org_by_addr(ip)
start,end = gi.range_by_ip(ip)
ran = list(IPRange(start,end))
# ipcount = len(ran)
ip_start,ip_end = IPAddress(start),IPAddress(end)
n_start = int(ip_start)
n_end = int(ip_end)
range = (n_start,n_end)
print ("%s|%s|%s|%s|%s|%s" % (asn,range,len(ran),org,ip,count) , file = o)
这可能是几件事;很难说没有看到你是如何 运行 以及你是如何初始化该文件的。
一个明确的可能性是文件没有被 flushed (more relevantly, see the docs on changing the buffer size of open() 因为它可能在您的代码中被调用)。
无论哪种方式,都值得使用 Python (2.5+) 的 with
语句来巧妙而稳健地处理文件/资源管理,而不是依赖 print
例如:
with open("/my/output/path.txt", "w") as out_file:
# Rest of code
# ...
out_file.write("%s|%s|%s|%s|%s|%s\n" % (asn,range,len(ran),org,ip,count))
有关使用 with
语句的良好示例,请参阅 this SO question。
您有两种方法可以实现这一点。
- 您可以更改代码以使用
with
语句(上下文
经理)正如@Nick B 在他打开文件的回答中所建议的
那里。
- 或者您可以将打开文件的缓冲设置为
行缓冲。
所以你说:
# Im assuming you open your file like this since your code is
# an incomplete snippet. Otherwise tell us how you open your file
o = open('output_file.log', 'w')
你必须说:
o = open('output_file.log', 'w', buffering=1) # enable line buffering
您应该通过在交互式 python shell 中键入 help(open)
来阅读 then open
命令的帮助。它详细解释了缓冲在 python.
中的工作原理
我是 运行 linux 服务器屏幕上的 python 脚本,当我执行 TOP 命令时我可以看到它 运行 但已经好几个小时了该脚本没有写任何东西。有人知道可能是什么原因吗?
这是我的脚本:
import GeoIP
from netaddr import *
gi = GeoIP.GeoIP("/data/GeoIPOrg_20141202.dat", GeoIP.GEOIP_MEMORY_CACHE)
o = Path to the output text file
for line in f:
line = line.strip('\n')
asn,ip,count =line.split('|')
org = gi.org_by_addr(ip)
start,end = gi.range_by_ip(ip)
ran = list(IPRange(start,end))
# ipcount = len(ran)
ip_start,ip_end = IPAddress(start),IPAddress(end)
n_start = int(ip_start)
n_end = int(ip_end)
range = (n_start,n_end)
print ("%s|%s|%s|%s|%s|%s" % (asn,range,len(ran),org,ip,count) , file = o)
这可能是几件事;很难说没有看到你是如何 运行 以及你是如何初始化该文件的。
一个明确的可能性是文件没有被 flushed (more relevantly, see the docs on changing the buffer size of open() 因为它可能在您的代码中被调用)。
无论哪种方式,都值得使用 Python (2.5+) 的 with
语句来巧妙而稳健地处理文件/资源管理,而不是依赖 print
例如:
with open("/my/output/path.txt", "w") as out_file:
# Rest of code
# ...
out_file.write("%s|%s|%s|%s|%s|%s\n" % (asn,range,len(ran),org,ip,count))
有关使用 with
语句的良好示例,请参阅 this SO question。
您有两种方法可以实现这一点。
- 您可以更改代码以使用
with
语句(上下文 经理)正如@Nick B 在他打开文件的回答中所建议的 那里。 - 或者您可以将打开文件的缓冲设置为 行缓冲。
所以你说:
# Im assuming you open your file like this since your code is
# an incomplete snippet. Otherwise tell us how you open your file
o = open('output_file.log', 'w')
你必须说:
o = open('output_file.log', 'w', buffering=1) # enable line buffering
您应该通过在交互式 python shell 中键入 help(open)
来阅读 then open
命令的帮助。它详细解释了缓冲在 python.