【问题标题】:How can I pass a python variable to a process in the command prompt如何在命令提示符下将 python 变量传递给进程
【发布时间】:2019-11-10 15:35:20
【问题描述】:

我有一个 python 循环,在每次迭代时都会在新路径中创建一个新图像。我想将该路径发送到先前执行的进程中,该进程正在命令提示符处等待路径。

更详细的:

我在 python 中运行一个自动驾驶模拟器,每 5 帧我想将当前帧(保存在 RAM 磁盘中)测试到我训练过的对象检测器算法中(花费大约 9 毫秒来检测我的对象但是 2 秒打开进程)。实际上,我使用 subprocess 模块执行训练后的算法,但我遇到的问题是当该进程打开时(我只打开一次进程,当我运行主脚本时)它正在等待路径图像。我相信通过您的提示,我已经接近答案,但我不知道如何将该路径图像传递给在每 5 帧迭代时等待它的子进程。

PD:我在 Windows,Python 3.5.4

你知道我能做什么吗?

【问题讨论】:

  • 你能更详细地描述一下吗?也许添加代码并告诉我们您尝试了什么,什么没有奏效?
  • 查看subprocess 库。它对这样的任务相当有用
  • 是的,我有一个 python 循环,它在每次迭代时都会在新路径中创建一个新图像。我想将该路径发送到先前执行的进程中,该进程正在命令提示符处等待路径。
  • 因为你没有给我们一些代码我可以想到几个不同的解决方案:1. shared variable multiprocessing2. Async IO3. global variable between threads
  • 最简单的方法可能是重构你的代码,这样你就不必那样做了。如果您可以编辑正在等待输入的进程的代码,您可以重定向标准输入,如one of these answers

标签: python


【解决方案1】:

感谢您的所有 cmets 和您的帮助。终于我做到了。

我使用库 'pexpect',它允许在 Python 脚本中使用函数 process = popen_spawn.PopenSpawn 启动程序。然后,该库中名为“send”的函数允许将参数传递给该正在运行的进程(process.send(arg))。

在我的例子中,我在脚本的开头启动程序 (.exe),将该实例定义为全局变量。然后我只需要在每次迭代时执行send 函数。

【讨论】:

    【解决方案2】:

    如果您在 *nix 环境中,并且我理解您想要什么,那么管道可以非常优雅地提供您想要做的事情。我不知道 Windows,但也许在那里可以使用相同的概念。

    这里有一个简单的例子来说明这一点:

    Pipe1a.py:

    #!/usr/bin/env python
    
    import time
    import sys
    
    for i in range(10):
        time.sleep(1) # represent some processing delay
        print("filename{}.jpg".format(i))
        sys.stdout.flush()
    

    Pipe1b.py:

    #!/usr/bin/env python
    
    import sys
    
    while True:
        line = sys.stdin.readline()
        if len(line) == 0:
            break
        print "Processing image '{}'".format(line.strip())
    

    如果您使这两个脚本都可执行,那么您可以在命令提示符处通过管道将它们链接在一起:

    > Pipe1a.py | Pipe1b.py
    

    结果输出:

    Processing image 'filename0.jpg'
    Processing image 'filename1.jpg'
    Processing image 'filename2.jpg'
    Processing image 'filename3.jpg'
    Processing image 'filename4.jpg'
    Processing image 'filename5.jpg'
    Processing image 'filename6.jpg'
    Processing image 'filename7.jpg'
    Processing image 'filename8.jpg'
    Processing image 'filename9.jpg'
    

    这里的概念是,一个进程将数据写入其stdout,而第二个进程从其stdin 读取该数据。

    如果您不想使用命令提示符将它们串在一起,而是想运行单个脚本,您可以使用 Python subprocess1 模块使用几乎相同的代码执行相同的操作。对于此示例,您可以让Pipe1b.py 程序通过subprocess.Popen 运行Pipe1a.py 程序,然后以同样的方式处理其输出。

    【讨论】:

      猜你喜欢
      • 2019-08-24
      • 1970-01-01
      • 1970-01-01
      • 2015-11-07
      • 1970-01-01
      • 2021-11-30
      • 1970-01-01
      • 1970-01-01
      • 2021-10-26
      相关资源
      最近更新 更多