Automation 为什么python程序无法获取最新的文件?

Automation 为什么python程序无法获取最新的文件?,automation,python-3.6,Automation,Python 3.6,我正在开发一个自动化POC,其中我必须按顺序执行以下步骤: 1) 在工具的帮助下创建debian pkg,并将其推送到云存储库 2) 在我的prod服务器上,我将通过cron作业执行一个python程序,该程序将持续监视云位置,如果有任何新文件可用,它将从那里提取该文件并将其(debian)安装到运行python程序的服务器上。然而,有可能云回购在几天内无法获得新文件。因此,在这种情况下,即使回购协议在3天前更新,但对于监控云位置的python程序来说,在新文件出现之前,上传到云上的文件将是最新

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

2) 在我的prod服务器上,我将通过cron作业执行一个python程序,该程序将持续监视云位置,如果有任何新文件可用,它将从那里提取该文件并将其(debian)安装到运行python程序的服务器上。然而,有可能云回购在几天内无法获得新文件。因此,在这种情况下,即使回购协议在3天前更新,但对于监控云位置的python程序来说,在新文件出现之前,上传到云上的文件将是最新的。因此,作为一种解决方法,我正在尝试使用将持续比较时间戳的逻辑,也就是说,如果debian文件的时间戳没有改变,那么python程序应该退出/通过,或者执行业务逻辑

我编写了两个程序,分别满足第(1)点和第(2)点。接下来,我将重点讨论第(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相同,那么什么都不做,只是传递。否则执行业务逻辑。 当我执行代码时,我确实看到一个文件被复制到了所需的位置,但是,如果我检查了文件的时间戳,那就没有了;t似乎是最新的。下面是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下午1:24:21。同样,我的代码是选择baqus_0.3-1_amd64.deb,它的时间戳是01:24:04 PM,比它低。 我已经执行了多次,只是为了确保我的观察是正确的,事实就是如此。每次将同一文件复制到目标位置时

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

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

我不确定自己是否完全理解需要这种变通方法的原因——但有一件事吸引了我的眼球:

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

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

作为排序结果的时间戳,存储
os.path.getmtime(最新的\u文件)
, 也就是说,根据

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

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

因此,尝试在这两个语句中使用
getmtime
。如果这不起作用,作为最后手段,
您也可以将文件命名为
20190516\u 095200\u sth.deb
并按文件名排序。

我不确定自己是否完全理解需要这种解决方法的原因,但有一件事吸引了我的眼球:

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

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

作为排序结果的时间戳,存储
os.path.getmtime(最新的\u文件)
, 也就是说,根据

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

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

因此,尝试在这两个语句中使用
getmtime
。如果这不起作用,作为最后手段,
您也可以将文件命名为
20190516\u 095200\u sth.deb
并按文件名排序。

你好,mcrot,谢谢您的回复,是的,我在两个位置都使用了getmtime(),它似乎正在修复我的最新文件和时间戳问题。现在我可以得到最新的文件。但现在我面临着另一个问题,同样的代码。我发现这个程序从来都不满足“if”块的要求,我可以说,因为,只要我执行代码,并且因为那里的现有文件已经存在4天了,所以程序会一次又一次地替换它。所以我对标志a做了一些逻辑上的改变。我在主帖子中添加了修改后的代码。更改为“a”=时间戳。因此,一旦子流程完成了执行,“a”的值就是时间戳的值。然而,正如您所知,当我删除“break”时,程序将进入永久循环。同样,同一个文件再次更新一次,但这次更改的时间戳也将永久保留。我不知道我是否能把我的信息清楚地传达给你。如果你有更多的问题,请告诉我。对不起,我仍然有点困惑,不明白你想要实现什么。我的建议是,用一个非常具体的例子创建一个新问题:文件夹中有三个文件,它们的名称+时间戳,以及尽可能简单的代码。如果系统调用(“Popen()”,“system()”)不相关,则使用“print”代替系统调用。然后描述你从中得到的输出,以及你期望得到的具体输出。那么很有可能其他人或我都明白出了什么问题。好吧,