Найти - Пользователи
Полная версия: как из python выполнить внешнюю комнаду?
Начало » Python для новичков » как из python выполнить внешнюю комнаду?
1
frpaul
Нужно следующее:
str = ‘gedit file.txt’ ну или скажем ‘feh image.jpg’
os.system(str)
То есть, хочется запустить внешнюю программу с аргументом, который передается из моего скрипта.

Подробности: Запуск файлов на выполнение происходит из gui (Tkinter). Фактически - файловый менеджер должен получиться (да, пилю свой велосипед, хочется). :)
Соответственно, хотелось бы, чтобы файлы можно было бы исполнять независимо (параллельные процессы?).

Как сделать? Спасибо.
Cleric
Для асинхронного запуска процессов, смотреть в сторону os.execl и его собратьев, а лучше на модуль из стандартной библиотеки subprocess. Так как execl и т.д. помечены устаревшими.
frpaul
Cleric
Для асинхронного запуска процессов, смотреть в сторону os.execl и его собратьев, а лучше на модуль из стандартной библиотеки subprocess. Так как execl и т.д. помечены устаревшими.
Спасибо! Буду разбираться
frpaul
Вот чего пока получилось. Учебный проект, т.ск. Но я им уже пользуюсь.
Большая просьба поправить ошибки, особенно “идеологические”. :)
Прога работает. Отступы исправил.

#! /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?), поиск по базе каментов.
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