Загрузка файла с помощью certutil и Python

#python #cmd

#python #cmd

Вопрос:

Я пытаюсь загрузить файл, вызвав команду cmd через Python. Когда я запускаю эту команду в cmd:

 certutil -urlcache -split -f https://www.contextures.com/SampleData.zip c:temptest.zip
  

Файл загружается без каких-либо проблем, но когда я запускаю эту команду через Python, файл не загружается. Я пытался:

 import subprocess
command = "certutil -urlcache -split -f https://www.contextures.com/SampleData.zip c:temptest.zip"

subprocess.Popen([command])
subprocess.call(command, shell=True)
  

также:

 os.system(command)
  

Есть идеи, почему это не работает? Любая помощь была бы высоко оценена.

Спасибо!

Комментарии:

1. Popen (и когда вы не используете shell=True ) может потребоваться список, подобный ["certutil", "-urlcache", "-split", "-f", "https://www.contextures.com/SampleData.zip", "c:temptest.zip"]

2. также может возникнуть проблема t , которая имеет особое значение в строке Python, и вы должны использовать "c:\temp\test.zip"

Ответ №1:

Во-первых: проблема может возникнуть, t что имеет особое значение в Python (и других языках), и вы должны использовать "c:\temp\test.zip" или вам придется использовать префикс r для создания необработанной строки r"c:temptest.zip"

Второе: когда вы не используете shell=True , вам нужен список, подобный

 ["certutil", "-urlcache", "-split", "-f", "https://www.contextures.com/SampleData.zip", "c:\temp\test.zip"]
  

Иногда люди просто используют split(' ') для его создания

 "certutil -urlcache -split -f https://www.contextures.com/SampleData.zip c:\temp\test.zip".split(" ")
  

И затем вы можете протестировать обе версии

 cmd = "certutil -urlcache -split -f https://www.contextures.com/SampleData.zip c:\temp\test.zip"

Popen(cmd.split(' '))

Popen(cmd, shell=True)
  

Редактировать:

Если у вас будет более сложная команда — ie. с " " внутренней строкой — тогда вы можете использовать стандартный модуль shlex и command shlex.split(cmd) . Чтобы сохранить \ путь, вам может понадобиться `posix = False

 import shlex

cmd = "certutil -urlcache -split -f https://www.contextures.com/SampleData.zip c:\temp\test.zip"

Popen(shlex.split(cmd, posix=False))
  

Например, это дает неверный список из 4 элементов

 '--text "hello world" --other'.split(' ')

['--text', '"hello', 'world"', '--other']
  

но это дает правильный список из 3 элементов

 shlex.split('--text "hello world" --other')

['--text', 'hello world', '--other']
  

Ответ №2:

Также можно указать raw строку, которая не будет интерпретировать escape-последовательности, такие как t .

 Python 3.8.4 (tags/v3.8.4:dfa645a, Jul 13 2020, 16:46:45) [MSC v.1924 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> print("nowtime")
now     ime
>>> print(r"nowtime")
nowtime
>>> print('nowtime')
now     ime
>>> print(r'nowtime')
nowtime