【问题标题】:How do I pass in a list of arguments to subprocess.run?(python)如何将参数列表传递给 subprocess.run?(python)
【发布时间】:2020-09-07 06:04:51
【问题描述】:

我有一个简单的 def 存储在 C:/Users/admin/Desktop/sample.py,

import time, os

def cook(sec):
    print('cooking started')
    time.sleep(sec)
    print(f'cooking done in {sec} sec(s) on process: {os.getpid()}')

我的目标是使用子进程库来运行 sample.py,我使用 anaconda 作为我的解释器

import subprocess
path = 'C:/ProgramData/Anaconda3/python.exe C:/Users/admin/Desktop/sample.py'
subprocess.run(path, shell=True)

如何将参数列表传递给 subprocess.run? 我尝试使用列表 [cook(1),cook(2),cook(3)] 加入路径。失败。我该怎么办? 理想情况下,传入一个列表并一个一个地运行def。 赞赏。

【问题讨论】:

  • 我不明白你为什么使用subpocess 来调用 Python 函数。让你的程序import sample 然后调用它的主函数。
  • 是的,我试过了。实际上,这就是我向领导提出的建议。领导说NO。我们必须使用 subprocess 来调用 py 文件。知道我将如何实现这一目标吗?
  • 使用 Windows \ 路径分隔符而不是 / 开始。将r 放在字符串的开头引号之前?这样您就不必转义它们:r'C:\... 将参数放在sample.py 之后的字符串中。在要求 subprocess 为您运行它之前,在控制台手动测试结果字符串。这样你会得到更多有用的错误信息。
  • 你可以像这样传递参数:subprocess.run(["/path/to/python.exe", "/path/to/sample.py", "--parameter1 1234", " --parameter2 asd"]),但您必须修改您的 sample.py 以接受参数,请参阅docs.python.org/3.3/library/argparse.html
  • 这是我从 termianl 得到的, CompletedProcess(args='C:/ProgramData/Anaconda3/python.exe C:/Users/admin/Desktop/sample.py "--parameter1"', returncode=0) 运行了吗?

标签: python shell subprocess


【解决方案1】:

一个非常简单的例子:

subprocess.run(["/path/to/python.exe", "/path/to/sample.py", "2", "3", "4"]) 

你的 sample.py

import time
import os
import sys


def cook(sec):
    print('cooking started')
    time.sleep(sec)
    print(f'cooking done in {sec} sec(s) on process: {os.getpid()}')


if __name__ == "__main__":
    # See argparser module, this is just a simple example without using argparser
    # Argument 0 is always the name of your file
    # Argument 1 is the number of cookings
    # Argument 2 and beyond are the seconds for those cookings
    numberOfCookings = int(sys.argv[1])
    for i in range(numberOfCookings):
        cook(int(sys.argv[2+i]))

【讨论】:

  • 我稍微调整了您的解决方案。 if name == "main": numberOfCookings = len(sys.argv) for i in range(1, numberOfCookings): cook(int(sys.argv[i] )) com = ["C:/path/to/python.exe", "C:/Users/admin/Desktop/sample.py", "2", "4", "6"] subprocess.run(com , shell=True) 会运行3次,参数2,4,6
  • 很高兴为您提供帮助,我喜欢您调整它的方式 :)
  • 我又测试了一遍,我的代码有一个大bug。它一直在运行,无限循环!我该如何解决?
  • 您能否打开一个新帖子并描述您面临的问题。并将该帖子的链接发送给我
  • 感谢您的回复。事情就是这样,我们决定导入函数,问题解决了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-29
  • 2017-12-29
  • 1970-01-01
  • 2022-01-08
  • 2021-06-01
  • 2019-03-02
  • 2015-06-06
相关资源
最近更新 更多