【问题标题】:Call a function at end of the script in Python在 Python 中调用脚本末尾的函数
【发布时间】:2013-11-28 04:28:23
【问题描述】:

到目前为止,我已经获得了很多帮助,并且能够成功地编写 Python 脚本。该脚本基本上调用一个 Windows 可执行文件,然后执行一些操作,例如从远程服务器拉下一些文件。在脚本的末尾,我有一个函数可以进行压缩并将检索到的文件移动到另一台服务器。到目前为止,脚本运行良好,但现在看起来我遇到了障碍。

脚本基本上接受 ParentNumber 作为输入并找到 1 个或多个 ChildNumber。一旦收集了 ChildNumbers 的列表,脚本就会重复调用带有该数字的 windows 可执行文件,直到它完成为所有这些文件提取数据。

如上所述,我为存档、移动文件和电子邮件通知构建的函数在脚本末尾被调用,如果只有一个 ChildNumber,该函数可以正常工作。如果有很多 ChildNumber 并且当可执行文件移动到第二个 ChildNumber 时,命令行有点将其视为结束并使用如下所示的新行进行统计:

.........
C:\Scripts\startscript.py
Input> ParentNumber
Retrieval started 
Retrieval finished
**Email Sent Successfully**
Preparing ParentNumber @childNumber

C:\Scritps\ParentNumber123\childNumber2
Retrieval Started
Retrieval finished
.........

`
如果您看到电子邮件发送成功消息上方的脚本流程仅显示在第一个 ChildNumber 下,这意味着它在脚本完成之前被调用。

我想要的实际行为是,一旦处理了所有 ChildNumber,就应该调用所有 ArchiveMoveEmailFunction,但不确定哪里出错了。

我的 ArchiveMoveEmailFunction 函数如下,它位于脚本中所有其他行的结尾:

def archiveMoveEmailNotification(startTime, sender, receivers):
"""
Function to archive, move and email
"""
Code for Archive
Code for Move to remote server
Code for email
archiveMoveEmailNotification(startTime, sender,receivers)

如果我在这里遗漏了一些内容来指定何时执行此函数,请告诉我。如前所述,如果 ParentNumber 只有 1 个 ChildNumber,它完全可以正常工作,因此不确定第二次检索跳转是否会导致一些问题。有没有办法让这个函数等到脚本中的其余函数被调用,或者将这个函数完全移动到另一个脚本并从主脚本调用该函数是合乎逻辑的?

这里是exe调用部分:

def execExe(childNumb):

cmd = "myExe retriveeAll -u \"%s\" -l \"%s\"" % (childNum.Url(),childAccount.workDir))
return os.system(cmd)

def retriveChildNumb(childNumb):

#Run the retrive
if not (execExe(childNumb)==0):
    DisplayResult(childNumb,3)
else:
    DisplayResult(childNumb,0)

return 0

对此的任何输入想法都非常有帮助。

【问题讨论】:

    标签: python function call


    【解决方案1】:

    您的问题冗长但难以理解;提供代码将使故障排除更加容易。

    也就是说,我怀疑您用于调用 Windows 可执行文件的代码是异步的,这意味着您的程序会继续(并完成)而不等待可执行文件返回值。

    【讨论】:

    • 完全同意你的看法,我是 python 的初学者,并试图对现有的代码进行增强,因此难以理解。至于返回值,程序确实以返回值结束,并且在同一脚本中为返回值维护了一个字典以进行日志记录。我已在原始问题中附加了 exe 调用部分。
    • 评论不能很好地处理代码,请用相关代码更新您的问题。
    • os.system() 不应该是异步的(参见docs.python.org/2/library/os.html#os.system),所以这似乎不是问题。您可能会共享其余代码,并且有人可以帮助您。我没有看到对 execExe 的递归调用,所以这将是接下来要查找的内容。
    • 感谢所有反馈。看起来我想通了这个问题。只有一个 threading.Thread 调用,我必须为递归调用进行更改。再次感谢@Nathan Fig
    猜你喜欢
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    • 2017-06-11
    • 1970-01-01
    相关资源
    最近更新 更多