Правильно ли я использую системный вызов / вызов подпроцесса? - PullRequest
0 голосов
/ 27 февраля 2019

Этот код завершается ошибкой при запуске:

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.Я застрял, и если кто-нибудь может помочь мне решить эту проблему, это было бы очень полезно.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Если возможно, передайте список , содержащий имя вашей команды и ее аргументы.

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

Это избавляет от необходимости даже знать, как оболочка будет обрабатывать командную строку.

0 голосов
/ 27 февраля 2019

Когда я впервые начал использовать некоторые методы подпроцесса, я столкнулся с некоторыми из тех же проблем.

Попробуйте запустить ваш код следующим образом:

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))

ВЫХОД:

sudo mam-list-userecords -s 2010-04-10 00: 00: 00-e2010-04-11 00:00:00 --формат csv --full

class 'str'

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

(вывод команды отредактирован.)

Когда установлен kwarg shellна False, который является значением по умолчанию, команда может быть коллекцией, которая shlex.split делает.

args должна быть последовательностью аргументов программы или иначеодна строка.По умолчанию программа для выполнения является первым элементом в args, если args - последовательность.Если args является строкой, интерпретация зависит от платформы и описана ниже.См. Shell и исполняемые аргументы для дополнительных отличий от поведения по умолчанию.Если не указано иное, рекомендуется передавать аргументы в виде последовательности.

Конструктор Popen

Эта проблема беспрестанно смущала меня, пока я не нашел этов документах.

...