从另一个Python代码在后台运行一个Python代码

时间:2019-03-08 21:30:36

标签: python oop parallel-processing subprocess pipeline

我有两个Python文件,文件1和文件2,它们分别执行两个操作。我想一起运行。我正在使用VS2017

文件1的伪代码为:

Class A:
   foo1():
    .
    .
   foo2();
    if variable<30;
        #do this
    else;
      subprocess.Popen('py file2.py')

    #rest of the code for foo2()

if __name__ == "__main__":   
  A.foo2();

当前,当我使用这种格式时,子进程确实会启动文件2并运行该文件,但是if-else条件之后的foo2()其余代码仅在该进程终止时运行(我已经设置的另一个条件)内部文件2)。

我正在尝试以某种方式工作,一旦满足if-else条件,文件2将在后台开始运行,并且将在命令窗口中提供输出,但也将运行文件1的其余部分。暂停文件1的运行,直到文件2完成。如果不在子进程中,则还有另一种方法可以同时启动两个文件,但可以通过传递“变量”的值来控制文件2的输出。我正在尝试找到适当的解决方法。

我是Python的新手。

编辑1:

我使用了命令:

process = subprocess.Popen('py file2.py' ,shell=True,stdin=None, stdout=None, stderr=None, close_fds=True)

即使我使用process.kill(),子进程仍然在后台运行。即使使用任务管理器也不会退出。

我还想将变量传递给第二个文件。我正在研究

variable = input("enter variable)
subprocess.Popen('py file2.py -a' + variable ,shell=True,stdin=None, stdout=None, stderr=None, close_fds=True)

但是据我所知,我只能通过子进程传递字符串。是真的吗?

1 个答案:

答案 0 :(得分:0)

我相信您可以同时使用多线程和多处理。如果要立即启动它们并监视变量,则可以将它们与管道或队列连接。

在触发时启动:

from py_file2.py import your_func
import threading

Class A:
   foo1():
    .
    .
   foo2();
    if variable<30;
         #do this
    else;

      #put something here to make sure it only starts once
      t = threading.Thread(target = your_func)
      t.start()

    #rest of the code for foo2()

if __name__ == "__main__":   
  A.foo2();

立即开始:

from py_file2.py import your_func
import threading
from queue import Queue

Class A:
   foo1():
    .
    .
   foo2(your_queue);
    if variable<30;
         #do this
    else;

      your_queue.put(variable)

    #rest of the code for foo2()

if __name__ == "__main__": 
  your_queue = Queue()
  t = threading.Thread(target = your_func, args = (your_queue,))
  t.start()  
  A.foo2(your_queue);