#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