Форум сайта python.su
есть задача открыть файл (не в питоне), пусть будет txt или word или что угодно, для этого используем
import os
os.startfile('NEWS.txt')
ок, мы его открыли
как потом, после закрытия, доказать что он закрыт?
я пробовал использовать
import psutil
и смотреть за процессами, но а если будет открыт другой файл а предыдущий будет закрыт, а процесс то один. Помогите пожалуйста
Офлайн
[code python]import psutil, os,re
def notClose(pid):
while psutil.pid_exists(pid)!=False:
pass
else: return False
def openFile(file):
data = {
'docx':'word',
'txt':'notepad'
}
try:
processName = data[re.split('\.',file)[-1]]
except KeyError:
print('Неизвестный формат файла')
os.startfile(file)
for i in psutil.pids():
process = psutil.Process(i)
if processName in data.name() or processName.upper() in data.name():
if notClose(data.pid)==False:
print(file,'closed')
[/code]
Офлайн
startfile() returns as soon as the associated application is launched. There is no option to wait for the application to close, and no way to retrieve the application’s exit status.
Офлайн
Думаю проблема ТС пошире - он не знает что запускать.
Судя по тому что он запускает ОС windows
Тогда можно командой assoc получить имя ассоциации
командой ftype по имени ассоциации получить шаблон командной строки
В него подставить имя файла.
И использовать не Popen а check_call тогда управление не вернется пока не закончится выполнение команды
Офлайн
doza_andТам есть метод .wait()
И использовать не Popen а check_call тогда управление не вернется пока не закончится выполнение команды
doza_andДа, но он не просто не знает, что запускать, а не знает, как это делается вообще.
Думаю проблема ТС пошире - он не знает что запускать.
Отредактировано py.user.next (Май 19, 2017 09:14:42)
Офлайн
Нихрена не выйдет, разные программы по разному работают с файлами, тот же блокнот открывает файл, считывает его в память и сразу закрывает, тоесть процесс еще не завершен, файл кагбэ “открыт” а реально он закрыт. Вы можете с ним сделать все что угодно, изменить, переименовать, удалить.
С вордом ситуация обратная, он открывает файл и держит его, пока его не звкроют.. проверить достаточно просто, банальный код:
import os import time myFile = 'r.doc' os.startfile(myFile) time.sleep(5) try: inFile = open(myFile,'ab') except IOError: print('файл {} еще открыт'.format(myFile)) else: print('файл {} закрыт'.format(myFile)) inFile.close()
[code python][/code]
Отредактировано PEHDOM (Май 19, 2017 14:22:13)
Офлайн
py.user.next:) а у меня вордовые документы ворд частенько не может открыть или портит при открытии. Поэтому конкретно у меня ассоциирован docx на Libreoffice. Ничего не поделаешь еще один уровень редиректа.
если у тебя документ ворда, открывай его только в ворде
Отредактировано doza_and (Май 19, 2017 21:13:44)
Офлайн
doza_andВидел, как в git'е сделано? Когда нужно сравнить два файла, используется difftool - абстрактный сравниватель.
Поэтому конкретно у меня ассоциирован docx на Libreoffice.
CONFIG VARIABLES
git difftool falls back to git mergetool config variables when the difftool equivalents have not been defined.
diff.tool
The default diff tool to use.
diff.guitool
The default diff tool to use when --gui is specified.
Отредактировано py.user.next (Май 20, 2017 10:53:29)
Офлайн
py.user.nextСогласен. Штатный способ сделать это в винде я описал. Там только от рождения fallback нету. Это надо самому пилить.
Так и здесь надо сделать ему: определить абстрактный текстовый редактор,
PEHDOMЗанятость файла проверяется элементарно. А то что приложение может считать файл и сразу закрыть, ну чтоже - значит он уже закрыт. Может пользователь его не по Save а по SaveAs сохранит. Значит это другой файл а не первый!
проверить достаточно просто, банальный код:
Офлайн
PS, если у человека только венда, тогда уже проще запускать файл через shellExecuteEх , венда сама найдет чем это файо открыть(при условии конечно что ассоциации выставлены в самой венде), запустит нужное приложение, откроет файл в этом приложении, и вернет хендл приложения, а уже имея хендл с помощью pywin32 или pywinauto с этим процессом можно делать все что угодно.
import win32com.shell.shell as shell import win32event fileName = 'test.txt' dict = shell.ShellExecuteEx(fMask = 64, lpFile=fileName, lpParameters='', nShow=1) hndl = dict['hProcess'] print (hndl) ret = win32event.WaitForSingleObject(hndl, -1) print (ret)
[code python][/code]
Отредактировано PEHDOM (Май 20, 2017 08:43:37)
Офлайн