如何从一个Python脚本中调用另一个Python脚本?

7
我有一个名为'b.py'的Python脚本,每5秒打印一次时间。
while (1):
   print "Start : %s" % time.ctime()
   time.sleep( 5 )
   print "End : %s" % time.ctime()
   time.sleep( 5 )

在我的a.py文件中,我通过以下方式调用b.py:

def run_b():
        print "Calling run b"
    try:
        cmd = ["./b.py"]

        p = subprocess.Popen(cmd,
                             stdout=subprocess.PIPE,
                             stderr=subprocess.STDOUT)

        for line in iter(p.stdout.readline, b''):
                        print (">>>" + line.rstrip())


    except OSError as e:
        print >>sys.stderr, "fcs Execution failed:", e  

    return None  

随后,我通过以下方式杀死'b.py': PS_PATH = "/usr/bin/ps -efW"

def kill_b(program):
    try:

        cmd = shlex.split(PS_PATH)

        retval = subprocess.check_output(cmd).rstrip()
        for line in retval.splitlines():

            if program in line:
                print "line =" + line
                pid = line.split(None)[1]
                os.kill(int(pid), signal.SIGKILL)

    except OSError as e:
        print >>sys.stderr, "kill_all Execution failed:", e
    except subprocess.CalledProcessError as e:
        print >>sys.stderr, "kill_all Execution failed:", e

run_b()
time.sleep(600)
kill_b("b.py")

我有两个问题。 1. 为什么我看不到“b.py”的任何输出,当我执行“ps -efW”时,我也看不到名为“b.py”的进程? 2. 为什么当我像上面那样杀死一个进程时,会看到“权限被拒绝”的消息?
我在Windows下的Cygwin上运行以上脚本。
谢谢。

6
Inception PythonInception是一个基于Python语言编写的深度学习框架,由Google Brain团队开发。它可以方便地创建、训练和部署各种深度学习模型,包括卷积神经网络和循环神经网络等。Inception还提供了一些先进的功能,如迁移学习和图像增强,以帮助研究人员和开发人员更轻松地构建高效的深度学习应用程序。 - Nick
1
一个更简单的方法来终止 b.py 的执行是在开始读取 b.py 的输出和调用 p.kill(); p.wait() 之前,从 run_b() 中返回 p - jfs
请检查 ./b.py 是否成功启动(p.poll() 应该为 None)。 - jfs
1个回答

1
我为什么看不到' b.py '的任何打印输出,当我执行' ps -efW '时,我看不到一个名为'b.py'的进程?更改run_b()行:
p = subprocess.Popen(cmd,
                     stdout=sys.stdout,
                     stderr=sys.stderr)
你将不会看到一个名为“b.py”的进程,而是类似于“python b.py”的东西,这有点不同。您应该使用pid而不是名称来查找它(在您的代码中,“p.pid”具有pid)。
为什么当我像上面那样杀死一个进程时,我看到“权限被拒绝”?os.kill仅在Windows 2.7+下受支持,并且与posix版本略有不同。但是,您可以使用“p.pid”。以跨平台方式最好的方法来杀死一个进程是:
if platform.system() == "Windows":
    subprocess.Popen("taskkill /F /T /PID %i" % p.pid, shell=True)
else:
    os.killpg(p.pid, signal.SIGKILL)

killpg 在OS X和其他类Unix操作系统上也可以工作。


要从当前的Python脚本运行另一个脚本,cmd需要是sys.executable,并且还需要将脚本名称“./b.py”作为参数传递。 - martineau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接