开发者

Python search through file

开发者 https://www.devze.com 2023-02-11 06:34 出处:网络
I\'m working on a python script that tries to add itself to startup on Linux via ~/.bashrc. I want the script to search through ~/.bashrc to see if it\'s already added. If it is then I just want to co

I'm working on a python script that tries to add itself to startup on Linux via ~/.bashrc. I want the script to search through ~/.bashrc to see if it's already added. If it is then I just want to continue with normal execution. If not, I want it to add itself to ~/.bashrc then continue. This is what I'm currently trying:

fname = sys.argv[0]
fpath = os.getcwd()
homepath = os.getenv("HOME")
startupfile = homepath + "/.bashrc"
fileopen = open(startupf开发者_运维百科ile, 'r')
for line in fileopen:
    if fname in line:
        break
    else: 
        os.system('echo "python ' + fpath + '/' + fname + ' &" >> ' + startupfile)
        break
fileopen.close()

Only problem is, it adds a lot of itself to ~/.bashrc. Like a hundred or so. I want it to just add once so the script runs on startup.


In general it might not be a good idea to add a python script itself to startup on Linux via ~/.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


you need to search the whole file and then either add the line or not, as the loop you have only checks the first line. because it break the loop right after either finding or not finding the name on the line.

you want:

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

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

second problem is that fname in line isn't the same as 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)


Why are you opening the file if you don't use python functions?

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

is never a good idea. You are not even using Python's IO functions.

And your problem is at your for loop, you are appending it when fname not in line, thats why it writes it hundred times.

The code should be like:

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()

And read: http://docs.python.org/tutorial/inputoutput.html

0

精彩评论

暂无评论...
验证码 换一张
取 消