up vote 25 down vote favorite

22

share [g+] share [fb] share [tw]

Is there a Pythonic way to have only one instance of a program running?

The only reasonable solution I've come up with is trying to run it as a server on some port, then second program trying to bind to same port - fails. But it's not really a great idea, maybe there's something more lightweight than this?

(Take into consideration that program is expected to fail sometimes, i.e. segfault - so things like "lock file" won't work)

Update: the solutions offered are much more complex and less reliant than just having a port occupied with a non-existent server, so I'd have to go with that one.

link|edit|retag|flag


upvote
flag
Perhaps your life would be easier if you tracked down and fixed the segfault. Not that it's an easy thing to do. –David Locke Dec 19 '08 at 15:53
upvote
flag
It's not in my library, it's in python's libxml bindings and extremely shy - fires only once a couple days. –Slava N Dec 20 '08 at 17:51
2 upvote
flag
Python's standard library supports flock(), which is The Right Thing for modern UNIX programs. Opening a port uses a spot in a much more constrained namespace, whereas pidfiles are more complex as you need to check running processes to invalidate them safely; flock has neither problem. –Charles Duffy Dec 20 '08 at 19:02

add comment

start a bounty

10 Answers

active oldest votes
up vote 22 down vote accepted

The above code should do the job, it is cross-platform and runs on Python 2.4-3.2. I tested it on Windows, OS X and Linux.

from tendo import singleton
me
= singleton.SingleInstance()# will sys.exit(-1) if other instance is running

The latest code version is available singleton.py. Please file bugs here.

You can install tend using one of the following methods:

  • easy_install tendo
  • pip install tendo
  • manually by getting it from http://pypi.python.org/pypi/tendo
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。