Форум сайта python.su
Хотелось бы из питона выполнять команды вида
"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" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
C:\>python backup_proba.py
"C:\Programs\7-Zip\7z.exe" a "C:\╘рщы ё яЁюсхырьш.7z" "C:\╘рщы ё яЁюсхырьш.txt"
-mx3
retout =
reterr = Синтаксическая ошибка в имени файла, имени папки или метке тома.
Офлайн
Нет, не решаема. Пробелы интерпретируются как разделители аргументов, следовательно, все пути нужно брать в кавычки. Если пробелов нет - то и кавычки не нужны. Это по поводу кавычек.
2-е - есть проблемы с кодировками.
Отредактировано (Апрель 27, 2009 15:29:37)
Офлайн
попробуй вместо пробелов поставить \0020, может заработает. только это для юникода)))
Отредактировано (Апрель 27, 2009 15:52:11)
Офлайн
Во первых: если хочется чтобы в командной строке правильно отображались русские буквы нужно перекодировать исходник в Досовскую кодировку и вместо cp1251 использовать cp866, но тогда и имя файла должно буть в Досовской кодировке, а это конечно не так. Поэтому лучше использовать латинские буквы.
Во вторых: можно твою прогу немного поправить.
вместо program='“C:\\Program Files\\7-Zip\\7z.exe”' написать program='7z.exe'
и например после строки print command добавить os.chdir('c:\\program files\\7-zip\\')
Офлайн
Спасибо за ответы.
Я так и не понял, чем кавычки во всех 3-х местах мешают команде popen, но, видимо, поделать с этим ничего нельзя (может, я не прав, но мне это представляется багом).
Переход в каталог с архиватором по совету BoSS, похоже, самый действенный метод решения проблемы, хотя до этого я использовал os.chdir для перехода в каталог с файлом, который надо архивировать.
А как раз с кодировками проблем не было, буквы только в DOS-окне тестового примера коряво отображаются, а архиватору скармливаются в Win-кодировке, и он их нормально переваривает. В своей основной программе я DOS-окно вообще не использую, а делаю LOG-файл в Win-кодировке.
Офлайн
Вообще интересная штука получается: если имя архива и имя пакуемого файла не содержат пробелов, то 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(":-)")
Офлайн
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(“:-)”)
Отредактировано (Апрель 7, 2010 09:29:36)
Офлайн
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')
Отредактировано (Апрель 7, 2010 12:06:25)
Офлайн
import subprocess
subprocess.Popen(["C:\Program Files\7-Zip\7z.exe", "C:\\Файл с пробелами.7z", "C:\\Файл с пробелами.txt", '-mx3'])
Офлайн
возможно поможет использование коротких имен файлов DOS (формат 8.3)
так, например, вместо C:\Program Files\ использовать C:\PROGRA~1\
чтобы посмотреть короткие имена файлов и поддиректорий в некоторой директории, следует в командной строке вызвать команду
dir диск:\путь\имя_файла /X (ключ /X - Отображение коротких имен для файлов, чьи имена не соответствуют стандарту 8.3.)
Офлайн