当前位置: 首页 > 面试题库 >

使用Popen打开进程并获取PID

柳轶
2023-03-14
问题内容

我正在做一个漂亮的小功能:

def startProcess(name, path):
    """
    Starts a process in the background and writes a PID file

    returns integer: pid
    """

    # Check if the process is already running
    status, pid = processStatus(name)

    if status == RUNNING:
        raise AlreadyStartedError(pid)

    # Start process
    process = subprocess.Popen(path + ' > /dev/null 2> /dev/null &', shell=True)

    # Write PID file
    pidfilename = os.path.join(PIDPATH, name + '.pid')
    pidfile = open(pidfilename, 'w')
    pidfile.write(str(process.pid))
    pidfile.close()

    return process.pid

问题是那process.pid不是正确的PID。似乎总是比正确的PID低1。例如,它说该进程始于31729,但是ps说它正在31730运行。每次我尝试将其关闭1。我猜它返回的PID是
当前 进程的PID ,而不是启动的PID ,并且新进程获得的“下一个” pid为高1。在这种情况下,我不能仅仅依靠返回值,process.pid + 1因为我不能保证它总是正确的。

为什么不process.pid返回新流程的PID,如何实现所追求的行为?


问题答案:

从位于http://docs.python.org/library/subprocess.html的文档中:

Popen.pid子进程的进程ID。

请注意,如果将shell参数设置为True,则这是生成的shell的进程ID。

shell我认为,如果为假,它将表现出预期的效果。

如果你依靠shellTrue解决使用可执行文件的路径PATH环境变量,您可以使用完成同样的事情shutil.which,而不是,然后传递给POPEN的绝对路径来代替。(subprocess.run顺便说一句,如果您使用的是Python
3.5或更高版本,则应该使用而不是Popen。



 类似资料:
  • 问题内容: 我正在使用popen()打开一个长期运行的过程。对于调试,我想在完成之前终止该过程。调用pclose()只会阻塞直到子项完成。 我如何杀死这个过程?我没有找到任何简单的方法来从popen()返回的资源中获取pid,以便可以向其发送信号。 我想我可以做些杂乱的事情,并尝试使用某种命令行黑客将pid混入输出中… 问题答案: 好了,找到了一个解决方案:我改回而不是。然后就这么简单:

  • 问题内容: 我正在尝试运行可执行文件并使用;捕获其输出;但是,我似乎并没有获得全部输出。 手动打开时,它比原始exe文件少打印两行。 我尝试了一种具有相同结果的替代方法: 任何人都可以帮助我获取exe的完整数据吗? 正如塞巴斯蒂安的要求: 原始exe文件最后几行o / p: -Gdd:通用计数(1-1000) -Cdd:切割起始于(0-99)-Edd:切割终止于(1-100) 请在下面选择流文件编

  • 问题内容: 有谁知道如何使用Java获取当前打开的窗口或本地计算机的进程? 我想做的是:像Windows Taskmanager一样列出当前打开的任务,窗口或打开的进程,但要使用多平台方法-如果可能,仅使用Java。 问题答案: 这是从命令 解析进程列表的另一种方法: 如果你使用的是Windows,则应更改以下行:等(第三行),如下所示: 希望该信息对你有所帮助!

  • 我能把1打印出来吗? 我尝试了以下: 它返回给我一个错误: 给定的选择器。//[@id='version id']/tbody/tr/td[2]/span/text()无效或不会导致webelement。出现以下错误:InvalidSelectorError:xpath表达式“.//[@id='version id']/tbody/tr/td[2]/span/Text()”的结果是:[object

  • 问题内容: 我对使用时如何搜索可执行文件感到困惑。如果给子进程提供了绝对路径,那么它就可以工作,但是我正在尝试使用相对路径。我发现,如果设置环境变量PYTHONPATH,则可以从该路径中获取导入的模块,并且PYTHONPATH在其中,但似乎对的行为没有帮助。我也尝试编辑将PYTHONPATH添加到的文件,就像这样 并验证了在以交互方式,与ipython或通过从命令行运行脚本启动python时,PY

  • 问题内容: 我正在尝试使用PyQt为名为“ HandBrake”的视频转换器应用程序构建一个简单的GUI。 我的问题是,当我选择要转换的视频文件时,子进程Popen使用必需的args启动手刹应用程序,但是在等待手刹完成gui时会被阻止,因此我无法进行任何更改。(例如:我不能禁用按钮,也不能更改其文本) 我不是在寻找更复杂的解决方案,例如progressbar等,但是我想在等待程序完成转换的同时简单