如何使用Python子进程打开另一个Python文件?

2024-06-02 08:24:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Python文件,我想打开它,保持打开5秒钟,然后关闭它,然后重复。为此,我使用Python子流程,使用以下代码:

import subprocess
import time
import sys

p = subprocess.Popen("pagekite.py")
time.sleep(4)
p.terminate()

但是,它给了我以下错误:

Traceback (most recent call last):
File "C:/Users/ozark/Desktop/Savir/Programming/Choonka/closetry.py", line 5, in <module>
p = subprocess.Popen("pagekite.py")
File "C:\Users\ozark\AppData\Local\Programs\Python\Python38-32\lib\subprocess.py", line 854, in 
__init__
self._execute_child(args, executable, preexec_fn, close_fds,
File "C:\Users\ozark\AppData\Local\Programs\Python\Python38-32\lib\subprocess.py", line 1307, in 
_execute_child
hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
OSError: [WinError 193] %1 is not a valid Win32 application

似乎只有可执行文件可以使用此方法打开?那么如何对Python文件执行相同的操作?任何帮助都将不胜感激。提前谢谢

修改:我现在使用subprocess.call('start pagekite.py',shell=True)。我如何终止这个?谢谢


Tags: 文件inpyimporttimelocallinecall
2条回答

我自己也有这个问题!实际上比看起来容易多了!不过,您需要一些模块来实现这一点,启动Python文件需要一些等待时间,但作为一个自动化过程,它非常有用

像这样简单的事情实际上不需要Psutil。参考下面的代码,你会发现一些问题:

import subprocess
import time
import sys
import os

while True:
  subprocess.call('start pagekite.py', shell=True)
  time.sleep(32)
  os.system("TASKKILL /F /IM py.exe")

基本上,Python脚本实际上是通过C:\WINDOWS\py.exe运行的,如果您能够关闭py.exe,您应该会很好!为此,只需使用os.system(“TASKKILL/F/IM py.exe”)

使用while循环,您可以永远运行代码,从而打开“pagekite.py”,将其保持打开至少20秒(我认为这将是这样一个脚本的加载时间-5秒是不够的),然后关闭“py.exe”,这将反过来关闭“pagekite.py”。后来,整个事情又发生了

您可以将“32”改回“5”,但“pagekite.py”可能没有足够的时间加载,因此我会将其保留为“32”,除非您的服务器管理大量流量

我希望这对你有帮助,并且编码快乐

我用过

subprocess.call('start python C:\your\path\to\your\file.py', shell=True)

它将启动到一个单独的窗口中,完成后关闭

您从未提到是否需要将子流程中的数据返回到调用流程。如果你这样做了,并且想要在DRAM中使用,那么(据我所知)上述方法将不会真正起作用。你需要安装管道。(当然,您可以通过写入HD的文件或通过共享内存服务器(如memcache)传回)

编辑:要在5秒后杀死子级(假设标称运行时间为>;5秒),需要PID

#In child
import os
pid = os.getpid()

杀了它

#In parent
import psutil
psutil.Process(pid).terminate() 

从孩子到父母获取信息不是我以前在记忆中做过的事情

#In parent  - note change from original proposal
subProc = subprocess.open('python', 'C:\your\path\to\your\file.py', stdout=sp.PIPE shell=True)
pipeOutput = subProc.stdout.read()

#In child
def main():
    #First duty is to report the PID back up to parent
    import os, sys
    pid = os.getpid()
    sys.stdout.write(pid)
    sys.sdout.flush()  #this *should* populate the pipe at this point
    
    #Then insert your existing functional code here

本来应该有用的。。。但是一个快速的测试,我不相信我的回报是一致的

编辑2:从这里开始: https://docs.python.org/3/library/subprocess.html#subprocess.run

我们可以尝试这种方法:

#All in parent
proc = subprocess.Popen(...)
try:
    outs, errs = proc.communicate(timeout=5)
except TimeoutExpired:
    proc.kill()
    outs, errs = proc.communicate()

相关问题 更多 >