【问题标题】:Python Keep running my imported scripts before subprocess callPython 在子进程调用之前继续运行我导入的脚本
【发布时间】:2015-11-24 04:26:04
【问题描述】:

好的,newserial.py 是我执行的主要脚本,trackid.py 是我想通过subprocess.call("trackid.py",shell=True) 执行的第二个脚本。我将__init__.py 和所有文件放在同一个文件夹中。

问题:但是,当我使用:import trackid 时,它会在到达行之前自动执行脚本:subprocess.call("trackid.py",shell=True)。 我读了教程说你应该放在我的代码中:

def main():
  if__name__=="__main__" 
  ...

然而,它没有帮助!我将def main(): 放在newserial.pytrackid.py 两个脚本中

问题:
如何阻止这种情况发生?
如何将trackid.py作为子进程执行并自动结束脚本并继续主脚本的剩余行newserial.py
导入时如何防止同名函数发生冲突?
什么时候用subprocess.call/subprocess.Popen最好什么时候用这些管道?

【问题讨论】:

    标签: python import subprocess popen


    【解决方案1】:

    您已经找到的提示意味着您应该像这样将所有代码包装在 trackid.py 中:

    def mytrackid():
        all your code goes here
        bla print bla
    
    if __name__ == '__main__':
        mytrackid()
    

    函数或类中的所有代码都将在导入模块时执行。 与

    if __name__ == '__main__':
    

    您确保仅当模块实际上是主模块时才执行此部分。

    【讨论】:

    • 就像我写的那样,它们都在函数 def main() 中。 trackid.py 不是主文件 newserial.py 是主文件。我将两个代码结合在一起。 def main() 包含主要代码(newserial.py),其中包含 def def dmain() 以 line if name == 'main':, 结尾我收到一个错误:unboundlocalerror:local variable 'dmain' referenced before assignment。我使用的是函数而不是变量。如何使我的函数全局化,以便可以在同一个脚本中访问它们?我必须承认 python 似乎是非结构化的。对于这样的简单任务。我不是在制造核弹头!
    • 就像你说的第二个脚本应该运行第一个脚本。谢谢
    【解决方案2】:

    如果你只是通过subprocess.call()调用trackid.py,那么你根本不需要导入它。

    仅当模块包含您希望在执行导入的脚本中调用的函数时,您才导入模块,所以

    script1.py

    def myfun():
       do stuff
    
    def myfun2():
       return(results)
    

    script2.py

    import script1
    
    script1.myfun()
    print script1.myfun2()
    

    当您导入模块时,任何不在函数中的代码都将被执行,因此您会看到问题。 if __name__ == __main__ 构造通常用于添加在脚本独立运行时出于测试目的而运行的代码。

    在这种情况下,将trackid.py 中的代码放在if __name__... 块中将确保它仅在您执行subprocess.call() 时执行,而不是在您导入模块时执行,但我不确定您为什么想要去做这个; subprocess 模块一般用于执行非python代码。

    我认为您可能想要做的是像我的script1 一样拥有trackid.py,其中包含导入后可以从newserial.py 调用的函数。

    【讨论】:

    • 就像我写的那样,它们都在函数 def main() 中。请重新阅读我的帖子。我不希望脚本在导入时运行,我只希望它在到达子进程时执行。 newserial.py 是主脚本 trackid.py 是第二个脚本。即使在删除导入行和 if__name_ 之后。 track.py 脚本首先运行来接管我的程序。我认为python是一种逐行的脚本语言。为什么它会跳转到子进程行。如何从 trackid.py 导入变量,以便在我的主 serial.py 中使用它?如何使函数全局化?
    • 你不是很清楚。也许如果您在上面发布了一些实际代码,它会有所帮助。如果您的代码位于 If __name__== __main__ 块中,则在导入代码时它不会运行。请看看如何写一个minimal reproducible example
    • 谢谢,我想通了,现在第二个脚本应该调用第一个脚本。好吧,我明白了……
    • 如果我的回答有帮助,请考虑标记为正确或赞成。
    猜你喜欢
    • 2013-12-08
    • 2015-06-10
    • 1970-01-01
    • 2020-10-13
    • 1970-01-01
    • 2014-12-17
    • 1970-01-01
    • 2018-07-13
    • 2012-03-10
    相关资源
    最近更新 更多