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

您有两种方法可以实现这一点。

  1. 您可以更改代码以使用 with 语句(上下文 经理)正如@Nick B 在他打开文件的回答中所建议的 那里。
  2. 或者您可以将打开文件的缓冲设置为 行缓冲。

所以你说:

# 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.

中的工作原理