为什么在';如果';语句不按照python程序中应用的逻辑工作?

为什么在';如果';语句不按照python程序中应用的逻辑工作?,python,automation,python-3.6,Python,Automation,Python 3.6,在我的prod服务器上,我将通过cron选项卡执行python程序,该选项卡将监视云位置,如果有任何新文件可用,它将被拉入并安装在运行python程序的服务器上。然而,有可能云回购在几天内无法获得新文件。因此,在这种情况下,最后更新的文件将保持python程序的最新文件,直到新文件出现。因此,一种方法是将文件的时间戳与代码中的某个标志进行比较,也就是说,如果Debian文件的时间戳没有改变,那么python程序将文件的时间戳与该标志进行比较,然后退出/通过,或者执行业务逻辑。下面是我尝试使用的代

在我的prod服务器上,我将通过cron选项卡执行python程序,该选项卡将监视云位置,如果有任何新文件可用,它将被拉入并安装在运行python程序的服务器上。然而,有可能云回购在几天内无法获得新文件。因此,在这种情况下,最后更新的文件将保持python程序的最新文件,直到新文件出现。因此,一种方法是将文件的时间戳与代码中的某个标志进行比较,也就是说,如果Debian文件的时间戳没有改变,那么python程序将文件的时间戳与该标志进行比较,然后退出/通过,或者执行业务逻辑。下面是我尝试使用的代码片段:

import os 
import subprocess 
import glob 

src_path = glob.iglob('path_to/*.deb')
trgt_path = '<Path>' 

try:
    for i in src_path:
        ltst_file = max(i, key=os.path.getmtime)
        time_stamp = os.path.getmtime(ltst_file)
        flag = 0
        while True:
            if flag == time_stamp:
                pass
            else:
                subprocess.Popen(['cp', '-r', ltst_file, trgt_path])
                flag = time_stamp
                break
except (ValueError, Exception, FileNotFoundError) as foo:
    print("Program couldn't bring the file from ab20", foo)
我不确定我遗漏的逻辑是什么,请提出建议

错误:

Traceback (most recent call last):
  File "x20.py", line 7, in <module>
    ltst_file = max(src_path, key=os.path.getmtime)
ValueError: max() arg is an empty sequence
我可以通过CLI将cd刻录到云位置,并且可以确认有5个debian文件

两个问题: 1) 我们的计划是通过cron作业执行代码。因此,如果我的理解正确,那么每次执行cron作业时,“latest_timestamp_processed”的值将始终默认为None。因此,如果云位置即使在几个小时内也没有更新,那么代码将始终将已经可用的文件视为最新文件,并且将继续在同一文件上继续工作。如果我错了,请纠正我。无论如何,我们可以通过修改现有代码来解决这个问题吗?或者,如果你有其他建议,一定要告诉我

2) 我计划在后台执行代码,并通过python日志模块生成日志。我已经修改了使用日志模块的代码,因为需要日志。因此,是的,在后台连续执行代码将生成大量日志,我肯定可以运行cron以一定的间隔删除它们。这部分我只是想让你知道


否则,您的代码将按预期工作。

我目前无法评论-如果我理解正确,您需要一个脚本

  • 没完没了
  • 定期查找给定源路径中的最新文件
  • 如果存在比上次复制的文件年轻的新文件, 然后复制该文件一次,然后再次等待更新的文件
对吗?这里有一个解决问题的建议。我只是用了一个
打印
,更容易测试。插入您需要的内容

导入操作系统
导入时间
导入glob
latest_timestamp_processed=无#还没有人
尽管如此:
source_files=list(glob.iglob('*.deb'))
如果len(source_files)>0:#只有在有文件的情况下才做某事
最新的\u文件=max(源\u文件,key=os.path.getmtime)
最新的\u时间戳=os.path.getmtime(最新的\u文件)
if(处理的最新时间戳为无)\
或(最新\u时间戳>最新\u时间戳\u处理):
尝试:
打印(“处理最新文件“{}”..”。格式(最新文件))
#Popen(['cp','-r',最新的\u文件,目标\u路径])
最新\u时间戳\u处理=最新\u时间戳
除作为exc的例外情况外:
打印(“处理最新文件“{}”时出错:{}”。格式(最新的_文件,exc))
其他:
打印(“未找到更新的文件”)
其他:
打印(“根本找不到文件”)
时间。睡眠(1)#等一秒钟(可能指定更多)
我插入了
time.sleep(1)
,以保护CPU电源

为了测试脚本,您可以在一个终端中运行它,然后打开第二个终端并使用创建新的(空)文件

touch test.deb
或者如果您想使用特定日期来模拟太旧的文件

touch test.deb-d“2019-01-03”

祝你好运。

你到底想用
max()
函数做什么呢?
break
命令将它从循环中弹出。“if”块不会改变循环。不确定其余的逻辑,但是
max
语句将不起作用。max的第一个参数必须是iterable(
i
不是)。我怀疑您想要
ltst\u file=max(src\u path,key=os.path.getmtime)
。但是这和你的
time\u stamp=
行在循环中不会改变,所以它们可能会在循环之前移动。我已经尝试在max()中添加src\u path,但是我总是遇到一个“空序列”错误,我已经更新了主帖子。这就是我使用for循环添加迭代器特性的主要原因,但我猜它不起作用。因此,如果您说max()函数将不起作用,请建议使用其他逻辑。我将
try..except
子句放在循环中,因为我希望您的脚本在出现错误时保持运行。如果您需要退出,也可以退出while-on-errors循环。是的,您的理解是正确的。我会考虑你的建议,并告诉你结果。不过谢谢你的努力。我已经完成了,程序直接转到最后一个“else”块,说:--没有找到任何文件。所以我在源文件后面使用了print语句,得到了空列表。我已经在主帖子中更新了。你完全试过我的代码了吗?当第一个文件出现在当前目录中时,它就对我起了作用。请注意,我没有在
source\u files=list(glob.iglob('*.deb'))
行中使用输入目录。您是否添加了正确的输入目录?如果是,如果您使用安装脚本的服务器上的“ls”列出“.deb”文件,是否会显示这些文件?是的,我使用的代码与您提供的代码完全相同,只是我用我的路径替换了源路径。我可以通过CLI访问该位置并执行ls,我可以在那里看到5个debian文件
Traceback (most recent call last):
  File "x20.py", line 7, in <module>
    ltst_file = max(src_path, key=os.path.getmtime)
ValueError: max() arg is an empty sequence
[]
No files found at all.
[]
No files found at all.
[]
No files found at all.
[]
No files found at all.
[]
No files found at all.
[]
No files found at all.