Форум сайта python.su
Нужно следующее:
str = ‘gedit file.txt’ ну или скажем ‘feh image.jpg’
os.system(str)
То есть, хочется запустить внешнюю программу с аргументом, который передается из моего скрипта.
Подробности: Запуск файлов на выполнение происходит из gui (Tkinter). Фактически - файловый менеджер должен получиться (да, пилю свой велосипед, хочется). :)
Соответственно, хотелось бы, чтобы файлы можно было бы исполнять независимо (параллельные процессы?).
Как сделать? Спасибо.
Офлайн
Для асинхронного запуска процессов, смотреть в сторону os.execl и его собратьев, а лучше на модуль из стандартной библиотеки subprocess. Так как execl и т.д. помечены устаревшими.
Отредактировано (Авг. 21, 2009 14:30:04)
Офлайн
ClericСпасибо! Буду разбираться
Для асинхронного запуска процессов, смотреть в сторону os.execl и его собратьев, а лучше на модуль из стандартной библиотеки subprocess. Так как execl и т.д. помечены устаревшими.
Офлайн
Вот чего пока получилось. Учебный проект, т.ск. Но я им уже пользуюсь.
Большая просьба поправить ошибки, особенно “идеологические”. :)
Прога работает. Отступы исправил.
#! /usr/bin/python
# -*- coding: utf-8 -*-
"""Файл-мэнеджер, обрабатывающий файлы Descript.ion, созданные программой FAR
Файлы раскодируются из DOS, выводится список файлов с их каментами, опция асинхронного запуска.
"""
from Tkinter import *
import codecs
import re
import os
import subprocess
root = Tk()
class wid:
def __init__(self):
# рисуем GUI
fr = Frame(root)
fr.pack(side=TOP)
self.bt = Button(fr, text='Run', command = self.yak)
self.bt.pack(side=LEFT)
self.en = Entry(fr, width=70)
self.en.pack(expand=NO, side=RIGHT)
# функция, выполняемая при нажатии кнопки run
def yak(self):
z = self.en.get()
ss = re.compile(r"(^(\".*?\"|[^ ]*) (.*$))") # отделяем имя файла от камента
u = list(ss.match(z).groups()) # to do: это надо делать в начале глав. цикла...
global f_name
f_name = u[1].replace('"','') # вычищаем лишние кавычки
img = ['jpg|JPG', 'gif|GIF', 'png|PNG', 'tiff|TIFF'] # файловые ассоциации
vid = ['avi|AVI', 'mpg|MPG']
# функция проверки расширения файлов
def check(ls):
ext = f_name[-3:] # вырезаем расширение из имени файла
for y in ls: # обходим переданный список расширений
t = re.compile(y)
if t.match(ext): # если расширение соответствует паттерну
w = os.getcwd() + '/' + f_name # выводим путь
break
else:
w = 0
return w
# вызов файлов.
wls = [] # список для передачи объекту Popen
if check(img) != 0: # если check нашел расширение и вернул путь к файлу
wls.append('feh') # делаем список для запуска в ком. строке
wls.append(check(img))
# print wls
subprocess.Popen(wls) # обработка списка (модуль subprocess)
else:
if check(vid) != 0:
wls.append('mplayer') # делаем список для запуска в ком. строке
wls.append(check(vid))
# print wls
subprocess.Popen(wls) # весь кусок после wls = [] - в объект. Не всем типам файлов нужен
# асинхронный запуск...
# else: # здесь должно быть исключение. лучше try - except
###################### MAIN ############################
try:
fp = codecs.open('./Descript.ion', "rb", "cp866") # читаем файло
l = fp.read()
p = l.split("\n")
fp.close
except:
print "no desc file found"
some = []
for i in range(len(p) - 1): # построчная обработка списка. Главный цикл.
some.append(wid()) # добавляем экземпляры класса, содержащего кнопку и поле ввода
some[i].en.insert(0, p[i].rstrip()) # пишем в поле текст из строки
root.mainloop()
# to do: 1 стоит здесь (в главном цикле) разделить имя файла и камент. То и другое - globals
# 2 добавить вывод ls (опционально вывод только откомментированных файлов)
# 3 сохранение файла описания в файл utf8 (desc.utf). при старте поиск этого файла, затем
# поиск старого файла Descript.ion
# 4 забить каменты в базу (lightSQL?), поиск по базе каментов.
Отредактировано (Авг. 22, 2009 16:49:10)
Офлайн