我正确使用系统调用/子进程调用吗?

问题描述 投票:0回答:2

运行时此代码失败:

import datetime
import subprocess

startdate = datetime.datetime(2010,4,9)
for i in range(1): 
    startdate += datetime.timedelta(days=1)

enddate = datetime.datetime(2010,4,10)
    for i in range(1): 
        enddate += datetime.timedelta(days=1)

subprocess.call("sudo mam-list-usagerecords -s \"" + str(startdate) + "\" -e \"" + str(enddate) + " --format csv --full")

程序运行时会出现以下错误:

  File "QuestCommand.py", line 12, in <module>
subprocess.call("sudo mam-list-usagerecords -s \"" + str(startdate) + "\" -e \"" + str(enddate) + " --format csv --full")
  File "/usr/lib64/python2.7/subprocess.py", line 524, in call
return Popen(*popenargs, **kwargs).wait()
  File "/usr/lib64/python2.7/subprocess.py", line 711, in __init__
errread, errwrite)
  File "/usr/lib64/python2.7/subprocess.py", line 1327, in _execute_child
raise child_exception

我已经用其他方式多次运行此代码,更改引号和诸如此类的东西。我是系统调用和使用HPC分配数据库的新手。我很困难,如果有人可以帮我解决这个问题非常有帮助。

谢谢!

python subprocess system allocation hpc
2个回答
1
投票

如果可能,传递包含命令名称及其参数的列表。

subprocess.call(["sudo", "mam-list-usagerecords",
                 "-s", str(startdate),
                 "-e", str(enddate),
                 "--format", "csv",
                 "--full"])

这样就无需知道shell将如何处理命令行。


0
投票

当我第一次开始使用一些子进程方法时,遇到了一些相同的问题。

尝试像这样运行你的代码:

import datetime
import subprocess
import shlex

startdate = datetime.datetime(2010, 4, 9) + datetime.timedelta(days=1)
enddate = datetime.datetime(2010, 4, 10) + datetime.timedelta(days=1)
command = (
    "sudo mam-list-usagerecords -s "
    + str(startdate)
    + "-e"
    + str(enddate)
    + " --format csv --full"
)

print(command)
print(type(command))
print(shlex.split(command))
subprocess.call(shlex.split(command))

OUTPUT:

sudo mam-list-usagerecords -s 2010-04-10 00:00:00-e2010-04-11 00:00:00 --format csv --full

class'str'

['sudo','mam-list-usagerecords',' - s','2010-04-10','00:00:00-e2010-04-11','00:00:00',' - -format','csv',' - fulll']

(命令输出已编辑。)

当kwarg shell设置为默认的False时,该命令可能必须是shlex.split所做的集合。

args应该是一系列程序参数或者是一个单独的字符串。默认情况下,如果args是序列,则要执行的程序是args中的第一项。如果args是一个字符串,则解释与平台有关,如下所述。有关与默认行为的其他差异,请参阅shell和可执行参数。除非另有说明,否则建议将args作为序列传递。

Popen constructor

在我在文档中发现这个问题之前,这个问题过去常常让我感到困惑。

© www.soinside.com 2019 - 2024. All rights reserved.