Найти - Пользователи
Полная версия: Выполнение команд виндовс с пробелами в путях
Начало » Python для новичков » Выполнение команд виндовс с пробелами в путях
1
Striver
Хотелось бы из питона выполнять команды вида
"C:\Program Files\7-Zip\7z.exe" a "C:\\Файл с пробелами.7z" "C:\\Файл с пробелами.txt" -mx3
Сама эта строка, набранная в командной строке виндовс прекрасно выполняется, архив создаётся.
Вот тестовая программа:
# -*- coding: cp1251 -*-
import os
program='"C:\\Program Files\\7-Zip\\7z.exe"'
filenamein='"C:\\Файл с пробелами.txt"'
filenameout='"C:\\Файл с пробелами.7z"'
command=program + ' a ' + filenameout + ' ' + filenamein + ' -mx3'
print command
pipe1,pipe2,pipe3=os.popen3(command)
retout=pipe2.read()
reterr=pipe3.read()
print 'retout = '+retout
print 'reterr = '+reterr
pipe1.close()
pipe2.close()
pipe3.close()
В том виде, как это записано выдаёт:
C:\>python backup_proba.py
"C:\Program Files\7-Zip\7z.exe" a "C:\╘рщы ё яЁюсхырьш.7z" "C:\╘рщы ё яЁюсхырьш.txt" -mx3
retout =
reterr = "C:\Program" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
Если в переменной program нет пробелов, но есть кавычки, то выдаёт такое:
C:\>python backup_proba.py
"C:\Programs\7-Zip\7z.exe" a "C:\╘рщы ё яЁюсхырьш.7z" "C:\╘рщы ё яЁюсхырьш.txt"
-mx3
retout =
reterr = Синтаксическая ошибка в имени файла, имени папки или метке тома.
Если же у программы нет ни пробелов ни кавычек, то всё прекрасно, команда выполняется, архив создаётся. Тоже самое, если имя программы с кавычками, но аргументы (имена файлов) без пробелов и кавычек, то тоже всё нормально, ошибок нет, архив создаётся.

В данный момент, конечно же, поступил простейшим образом - закинул архиватор в каталог без пробелов в пути и запускаю без кавычек, но хотелось бы знать, решаема ли проблема в общем случае.
Использую python 2.5
Ferroman
Нет, не решаема. Пробелы интерпретируются как разделители аргументов, следовательно, все пути нужно брать в кавычки. Если пробелов нет - то и кавычки не нужны. Это по поводу кавычек.
2-е - есть проблемы с кодировками.
Doberman26rus
попробуй вместо пробелов поставить \0020, может заработает. только это для юникода)))
BoSS
Во первых: если хочется чтобы в командной строке правильно отображались русские буквы нужно перекодировать исходник в Досовскую кодировку и вместо cp1251 использовать cp866, но тогда и имя файла должно буть в Досовской кодировке, а это конечно не так. Поэтому лучше использовать латинские буквы.
Во вторых: можно твою прогу немного поправить.
вместо program='“C:\\Program Files\\7-Zip\\7z.exe”' написать program='7z.exe'
и например после строки print command добавить os.chdir('c:\\program files\\7-zip\\')
Striver
Спасибо за ответы.

Я так и не понял, чем кавычки во всех 3-х местах мешают команде popen, но, видимо, поделать с этим ничего нельзя (может, я не прав, но мне это представляется багом).

Переход в каталог с архиватором по совету BoSS, похоже, самый действенный метод решения проблемы, хотя до этого я использовал os.chdir для перехода в каталог с файлом, который надо архивировать.

А как раз с кодировками проблем не было, буквы только в DOS-окне тестового примера коряво отображаются, а архиватору скармливаются в Win-кодировке, и он их нормально переваривает. В своей основной программе я DOS-окно вообще не использую, а делаю LOG-файл в Win-кодировке.
pyuser
Вообще интересная штука получается: если имя архива и имя пакуемого файла не содержат пробелов, то C:\Program Files\7-Zip\7z.exe можно не брать в кавычки, если же имя архива или имя файла содержат пробелы то, как я ни бился - заставить работать так и не получилось…

в тоже время у меня замечательно работает скрипт пакующий файлы, имена которых содержат пробелы :)

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

import subprocess # справочная система Python настоятельно рекомендует использовать его вместо os.popen...

PATH_7Z = r"C:\Program Files\7-Zip\7z.exe"
ARCHIVE = r"....."

# готовлю список файлов, пусть будет файл flist.lst

if 0 == subprocess.call([PATH_7Z, "a", ARCHIVE, "@flist.lst", .....], shell=True) :
print(":-)")
qman
pyuser
import subprocess # справочная система Python настоятельно рекомендует использовать его вместо os.popen… PATH_7Z = r“C:\Program Files\7-Zip\7z.exe” ARCHIVE = r“…..” # готовлю список файлов, пусть будет файл flist.lst if 0 == subprocess.call(, shell=True) : print(“:-)”)
подскажите как в питон передать содержимое экрана?
P.S. чтобы логи можно было потом например отправить по почте.
o7412369815963
Striver
Хотелось бы из питона выполнять команды вида
на 2,6 win, код старый но работает стабильно:
def start(com):
w, a = os.popen4(com,'t',-1)
w.close()
try:
while 1:
s = a.readline()
if not s: break
#print s
return
except:
raise Exception('error start local 1c')

start(r'"C:\Program Files\1Cv77\BIN\1CV7s.exe" config /d\\srv\base /Nuser /Ppasw /@\\srv\Base\script.1c')
os.popen взывает subprocess.Popen, и лучше переписать на субпроцес
Rodegast
import subprocess
subprocess.Popen(["C:\Program Files\7-Zip\7z.exe", "C:\\Файл с пробелами.7z", "C:\\Файл с пробелами.txt", '-mx3'])
e1isa
возможно поможет использование коротких имен файлов DOS (формат 8.3)
так, например, вместо C:\Program Files\ использовать C:\PROGRA~1\
чтобы посмотреть короткие имена файлов и поддиректорий в некоторой директории, следует в командной строке вызвать команду
dir диск:\путь\имя_файла /X (ключ /X - Отображение коротких имен для файлов, чьи имена не соответствуют стандарту 8.3.)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB