Сложность использования subprocess.check_output с аргументом командной строки во многих частях

#python #subprocess

#python #подпроцесс

Вопрос:

У меня есть инструмент командной строки, который я запускаю следующим образом:

 /home/user/Dennis -- - -- ----- --   - - -- -- -  - --- -- --  -    -  -- ---    -   -  - -     -- ----- --- --    ---  - ---- ----      -    --- - ----------  -----  ------  --  - -    ---   --       - -----  -   -----   -   -    -- -  --  ---  -   -  --    -  ---- --- --  -     ---- --  -   - --      -    - -    -   ------    -  -  - --  -- --- - ---   -   --- ---  --   -- --    - - --  -- ------- - -- ---  -- - -- -   -   ---- - ---   -------   - -----  - --------      -- -  -      -         -----     - -     - --- -  ---    ---  - ---   - --- -  --  ---  - -  -    - --------- -   -   ---  ----- - -- --         - -  -- ----  - - - --- --  --------   -- ---
-5258461839360
  

Другими словами, в качестве аргумента командной строки используется длинная строка из и -s, разделенных пробелами. Я пытаюсь вызвать его из Python. В ipython я делаю:

 In [1]: outstr = "-- - -- ----- --   - - -- -- -  - --- -- --  -    -  -- ---    -   -  - -     -- ----- --- --    ---  - ---- ----      -    --- - ----------  -----  ------  --  - -    ---   --       - -----  -   -----   -   -    -- -  --  ---  -   -  --    -  ---- --- --  -     ---- --  -   - --      -    - -    -   ------    -  -  - --  -- --- - ---   -   --- ---  --   -- --    - - --  -- ------- - -- ---  -- - -- -   -   ---- - ---   -------   - -----  - --------      -- -  -      -         -----     - -     - --- -  ---    ---  - ---   - --- -  --  ---  - -  -    - --------- -   -   ---  ----- - -- --         - -  -- ----  - - - --- --  --------   -- ---"

In [2]: from subprocess import check_output

In [3]: check_output(["/home/user/Dennis", outstr])
Out[3]: '-1n'
  

Я предполагаю, что это пробелы, которые вызывают проблему.

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

Ответ №1:

Разделите outstr и передайте разделенную строку из списка в check_call() . Самый простой способ внести изменения в ваш текущий код — сделать его как:

 from subprocess import check_call

outstr = "-- - -- ----- --   - - -- -- -  - --- -- --  -    -  -- ---    -   -  - -     -- ----- --- --    ---  - ---- ----      -    --- - ----------  -----  ------  --  - -    ---   --       - -----  -   -----   -   -    -- -  --  ---  -   -  --    -  ---- --- --  -     ---- --  -   - --      -    - -    -   ------    -  -  - --  -- --- - ---   -   --- ---  --   -- --    - - --  -- ------- - -- ---  -- - -- -   -   ---- - ---   -------   - -----  - --------      -- -  -      -         -----     - -     - --- -  ---    ---  - ---   - --- -  --  ---  - -  -    - --------- -   -   ---  ----- - -- --         - -  -- ----  - - - --- --  --------   -- ---"

check_call_args = ["/home/user/Dennis"]   outstr.split(' ')
check_call(check_call_args)
  

where str.split(' ') разделит вашу строку на список подстрок, разделенных пробелом ' ' .