首页 > 解决方案 > 为什么python程序无法获取最新文件?

问题描述

我正在开发一个自动化 POC,其中我必须按顺序执行以下步骤:1)在工具的帮助下创建一个 debian pkg,并将其推送到云存储库

2)在我的产品服务器上,我将通过一个 cron 作业执行一个 python 程序,它将继续监视云位置,如果有任何新文件可用,它将从那里提取该文件并将其安装(debian)在服务器上从哪里运行 python 程序。但是,云存储库有可能几天都没有获得新文件。因此,在这种情况下,即使 repo 在 3 天前更新,但对于监控云位置的 python 程序,上传到云上的文件将是最新的,直到有新文件出现。因此,作为一种解决方法,我正在尝试处理将继续比较时间戳的逻辑,即如果 debian 文件的时间戳没有改变,那么 python 程序应该退出/通过,否则执行业务逻辑.

我编写了两个满足第 (1) 点和部分满足第 (2) 点的程序。因此,接下来,我将重点关注 point(2) 代码。下面是我认为应该在后台工作以提取最新文件的代码,如果时间戳相同,那么它应该退出,为了测试场景,我刚刚采用了我机器的本地路径:

import os
import subprocess
import glob
latest_file = 0 # initialized latest_file with zero to compare later
new_path = '/home/amitesh/Desktop'
file_path = glob.iglob('/home/amitesh/Desktop/linux_triad/*.deb')

latest_file = max(file_path, key=os.path.getctime) # Now the latest_file variable has a file in it
time_stamp = os.path.getmtime(latest_file)# gives the timestamp of the latest file

a = 0 # initialized it with zero to compare it with time stamp as follows.
while True:
    if a == time_stamp:
        pass
    else:
        subprocess.Popen(['cp', '-r', latest_file, new_path])
        break

在上面的代码中,我只是想比较两个变量'a'和'timestamp',即如果a的值与time_stamp相同,那么什么都不做,直接通过。否则执行业务逻辑。当我执行代码时,我确实看到一个文件被复制到了所需的位置,但是,如果我检查文件时间戳,那似乎不是最新的。下面是 file_path 变量中可用的一堆文件。

baqus_0.1-2_amd64.deb Tue 14 May 2019 01:24:02 PM IST
baqus_0.3-1_amd64.deb Tue 14 May 2019 01:24:04 PM IST
baqus_0.4-1_amd64.deb Tue 14 May 2019 01:24:09 PM IST
leesofd_0.1-1_amd64.deb Tue 14 May 2019 01:24:16 PM IST
syslmd_0.3-2_amd64.deb Tue 14 May 2019 01:24:21 PM IST

我的代码从列表中选择了第二个文件,如果我们仔细观察,它似乎没有最新的时间戳。最新的时间戳属于 syslmd_0.3-2_amd64.deb,即 IST 下午 01:24:21。所以,我的代码再次选择 baqus_0.3-1_amd64.deb,它的时间戳为 01:24:04 PM IST,它更低。我已经多次执行它只是为了确保我的观察是正确的,事实就是如此。每次将相同的文件复制到目标位置。

所以,要么我的逻辑错了,要么我使用了错误的函数。请建议。

while 循环内更改的代码

if a == time_stamp:
    pass
else:
    print('copying of the ', latest_file, 'started')
    sleep(4)
    subprocess.Popen(['cp', '-r', latest_file, new_path])
    sleep(3)
    os.system('sudo dpkg --install ' +latest_file)
    a = time_stamp

标签: automationpython-3.6

解决方案


我不确定我是否完全理解需要这种解决方法的原因 - 但有一件事引起了我的注意:

您正在使用 对文件进行排序key=os.path.getctime。遵循文档 _

“在某些系统(如 Unix)上是最后一次元数据更改的时间,而在其他系统(如 Windows)上,是路径的创建时间”。

作为排序结果的时间戳,您存储os.path.getmtime(latest_file),即根据文档

“返回上次修改路径的时间。”

根据这个问题,这两个时间戳不一定相同。所以这ctime也可能取决于时间,文件被复制,这取决于您在步骤 1) 中推送文件的方式。相反,mtime与文件内容有关。

所以尝试getmtime在这两个语句中使用。如果这不起作用,作为最后的手段,您还可以将文件命名为喜欢20190516_095200_sth.deb并按​​文件名排序。


推荐阅读