почему одна и та же команда powershell выполняется на консоли powershell, но не с использованием os.system?

#python #powershell #os.system

Вопрос:

Я хотел бы включить команду для создания архива 7zip в скрипте Python. Поскольку я работаю в Windows, мне нужно передать команду в консоль powershell. Я планирую сделать это с os.system помощью (я знаю , что это не лучший способ сделать это и что я должен использовать subprocess , но мне действительно просто нужно быстрое решение, и для меня было бы недостаточно времени, чтобы научиться использовать новый модуль в этом контексте). Следующая команда работает, если она выполняется из консоли powershell

 amp;'C:\Program Files\7-Zip\7z' a -mx=0 X:/myarch.zip X:/myarch
 

Поэтому я воссоздаю ту же строку в python следующим образом:

 cmdl = r"amp;'C:\Program Files\7-Zip\7z' a -mx=0 X:/myarch.zip X:/myarch"
 

Строка интерпретируется следующим образом:

 "amp;'C:\\Program Files\\7-Zip\\7z' a -mx=0 X:/myarch.zip X:/myarch"
 

Теперь, если я скопирую и вставлю приведенную выше строку в консоль powershell, она будет работать без проблем. Однако, если я запущу его в python с помощью os.system(cmdl) , я получу следующую ошибку

 "The filename, directory name, or volume label syntax is incorrect"
 

Почему это так и как я могу решить эту проблему ?

Ответ №1:

os.system предназначен для выполнения команд cmd, команды cmd можно запускать в powershell, возможно, в конце концов powershell немного продвинут, но я уверен, что вы не можете запустить команду cmd в powershell, отныне ваш код не работает.

Однако творческим решением для выполнения команды powershell из python(без использования python) было бы записать вашу команду в файл .ps(сценарий powershell), а затем запустить ее с помощью os.startfile() (используйте этот код: os.startfile("script.ps") )

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

1. Я переписал команду для работы с cmd, а не с powershell, и теперь она работает нормально.

2. @fednem я отредактировал свой пост, если вы все еще хотите выполнить команду powershell, то можете использовать то, что я сказал

3. нет необходимости сохранять в файл ps1. Вы можете позвонить powershell непосредственно из cmd