Python поиск по файлу - PullRequest
       37

Python поиск по файлу

0 голосов
/ 19 февраля 2011

Я работаю над сценарием Python, который пытается добавить себя в автозагрузку в Linux через ~ / .bashrc.Я хочу, чтобы скрипт просматривал ~ / .bashrc, чтобы увидеть, добавлен ли он уже.Если это так, то я просто хочу продолжить нормальное выполнение.Если нет, я хочу добавить себя в ~ / .bashrc и продолжить.Вот что я сейчас пытаюсь:

fname = sys.argv[0]
fpath = os.getcwd()
homepath = os.getenv("HOME")
startupfile = homepath + "/.bashrc"
fileopen = open(startupfile, 'r')
for line in fileopen:
    if fname in line:
        break
    else: 
        os.system('echo "python ' + fpath + '/' + fname + ' &" >> ' + startupfile)
        break
fileopen.close()

Единственная проблема в том, что она добавляет много себя в ~ / .bashrc.Как сотня или около того.Я хочу, чтобы он просто был добавлен один раз, чтобы скрипт запускался при запуске.

Ответы [ 3 ]

0 голосов
/ 19 февраля 2011

Почему вы открываете файл, если не используете функции python?

os.system('echo "python ' + fpath + '/' + fname + ' &" >> ' + startupfile)

никогда не бывает хорошей идеей. Вы даже не используете функции ввода-вывода Python.

И ваша проблема в цикле for, вы добавляете его, когда fname не в строке, поэтому он записывает его сто раз.

Код должен быть таким:

command="python run.py"
startupfile="bashrc"

f=open(startupfile,"r")

found=False
for line in f:
        if command in line:
                found=True
                break

f.close()

if not found:
        f=open(startupfile,"a")
        f.write(command)
        f.close()

И читать: http://docs.python.org/tutorial/inputoutput.html

0 голосов
/ 20 февраля 2011

В общем случае не стоит добавлять сам скрипт Python для запуска в Linux через ~/.bashrc.

import fileinput
import os

# assume script name is unique in the .bashrc context
uniqkey = os.path.basename(__file__)
startupfile = os.path.expanduser('~/.bashrc')
startupline = 'python %s &\n' % os.path.abspath(__file__)

written = False
for line in fileinput.input(startupfile, inplace=1):
    if uniqkey in line:
        if not written: 
            written = True
            print startupline, # rewrite
        #else do nothing (it removes duplicate lines)
    else:
        print line,

if not written: # add startup line if it is not present
   open(startupfile,'a').write('\n'+startupline) # ignore possible race condition
0 голосов
/ 19 февраля 2011

вам нужно выполнить поиск по всему файлу, а затем либо добавить строку, либо нет, поскольку у вас есть цикл, который проверяет только первую строку. потому что он прерывает цикл сразу после нахождения или не нахождения имени в строке.

Вы хотите:

found = False
for line in fileopen:
    if fname in line:
        found = True
        break

if not found:
   os.system('echo "python ' + fpath + '/' + fname + ' &" >> ' + startupfile)

Вторая проблема в том, что fname in line не совпадает с line.find(fname) > -1

found = False
for line in fileopen:
    if line.find(fname) > -1:
        found = True
        break

if not found:
   os.system('echo "python ' + fpath + '/' + fname + ' &" >> ' + startupfile)
...