Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 27, 2009 13:34:59

Striver
От:
Зарегистрирован: 2006-10-26
Сообщения: 247
Репутация: +  22  -
Профиль   Отправить e-mail  

Выполнение команд виндовс с пробелами в путях

Хотелось бы из питона выполнять команды вида

"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



Офлайн

#2 Апрель 27, 2009 15:28:14

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

Выполнение команд виндовс с пробелами в путях

Нет, не решаема. Пробелы интерпретируются как разделители аргументов, следовательно, все пути нужно брать в кавычки. Если пробелов нет - то и кавычки не нужны. Это по поводу кавычек.
2-е - есть проблемы с кодировками.

Отредактировано (Апрель 27, 2009 15:29:37)

Офлайн

#3 Апрель 27, 2009 15:48:56

Doberman26rus
От: Ставрополь
Зарегистрирован: 2009-03-16
Сообщения: 128
Репутация: +  1  -
Профиль   Отправить e-mail  

Выполнение команд виндовс с пробелами в путях

попробуй вместо пробелов поставить \0020, может заработает. только это для юникода)))



подпись

Отредактировано (Апрель 27, 2009 15:52:11)

Офлайн

#4 Апрель 27, 2009 18:38:59

BoSS
От:
Зарегистрирован: 2009-04-26
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Выполнение команд виндовс с пробелами в путях

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



Офлайн

#5 Апрель 28, 2009 06:13:00

Striver
От:
Зарегистрирован: 2006-10-26
Сообщения: 247
Репутация: +  22  -
Профиль   Отправить e-mail  

Выполнение команд виндовс с пробелами в путях

Спасибо за ответы.

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

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

А как раз с кодировками проблем не было, буквы только в DOS-окне тестового примера коряво отображаются, а архиватору скармливаются в Win-кодировке, и он их нормально переваривает. В своей основной программе я DOS-окно вообще не использую, а делаю LOG-файл в Win-кодировке.



Офлайн

#6 Апрель 28, 2009 10:54:41

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Выполнение команд виндовс с пробелами в путях

Вообще интересная штука получается: если имя архива и имя пакуемого файла не содержат пробелов, то 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(":-)")



Офлайн

#7 Апрель 7, 2010 04:51:42

qman
От:
Зарегистрирован: 2007-07-02
Сообщения: 444
Репутация: +  0  -
Профиль   Отправить e-mail  

Выполнение команд виндовс с пробелами в путях

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. чтобы логи можно было потом например отправить по почте.



Отредактировано (Апрель 7, 2010 09:29:36)

Офлайн

#8 Апрель 7, 2010 12:05:50

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Выполнение команд виндовс с пробелами в путях

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, и лучше переписать на субпроцес

Отредактировано (Апрель 7, 2010 12:06:25)

Офлайн

#9 Апрель 7, 2010 23:06:57

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2695
Репутация: +  182  -
Профиль   Отправить e-mail  

Выполнение команд виндовс с пробелами в путях

import subprocess
subprocess.Popen(["C:\Program Files\7-Zip\7z.exe", "C:\\Файл с пробелами.7z", "C:\\Файл с пробелами.txt", '-mx3'])



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Онлайн

#10 Апрель 30, 2010 09:29:37

e1isa
От:
Зарегистрирован: 2010-04-30
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Выполнение команд виндовс с пробелами в путях

возможно поможет использование коротких имен файлов DOS (формат 8.3)
так, например, вместо C:\Program Files\ использовать C:\PROGRA~1\
чтобы посмотреть короткие имена файлов и поддиректорий в некоторой директории, следует в командной строке вызвать команду
dir диск:\путь\имя_файла /X (ключ /X - Отображение коротких имен для файлов, чьи имена не соответствуют стандарту 8.3.)



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version