[Pythonmac-SIG] Where to put data (original) (raw)

Chris Barker Chris.Barker at noaa.gov
Tue Dec 21 18:05:38 CET 2004


Charles Hartman wrote:

With an earlier app I wanted an external data file and everybody told me to make it internal to the program (the app's Resources, I guess) instead. I couldn't, then. Now with a new app I want to do just that, but I'm not sure how to do it!

It's a file of data -- a Python dictionary object, after it's loaded into memory -- which will grow and change as the app is used; when the app terminates the data ought to be saved with it for next time. In this case I don't want users fiddling with it apart from the app.

Just a few thoughts. All these systems are multi-user systems, though Linux is the only one that really enforces that behavior in common use. OS-X is second, and Windows is alarmingly sloppy.

What this means is that, in general, an application will be installed to a system location, and can be run by multiple users. In this case, a distinction needs to be made between user data and configuration, and system data and configuration. Most Unix software has both, and the usual behavior is to load the system data, then load the users data, perhaps overriding the system data in various ways.

The system data is stored in a system location, and can only be changed by the super user. The location of the system data on Linux is usually in /etc/ or somewhere in either /usr or /usr/local (depending on how it's installed) often in /usr/share or /usr/local/share. Take a look at the Linux File system Hierarchy Standard for a description of what to put in share vs lib, vs whatever. In general, what seems like an overly complicated system is designed to accommodate things like networked file systems and heterogeneous networks. If you don't need all that, you can also just put your data into /usr/local/MyApp.

User data is generally stored in $HOME/.MyApp

On OS-X, there is /Library/MyApp and $HOME/Library/MyApp for system and user data. You also might want to put system data in the Application Bundle, but that won't work for user data, as the user can't change an Application bundle that's installed in the system (at least I hope they can't!)

I think if you use the wxConfig system, you'll get the appropriate behavior for user data on all systems, at least for config files.

At the app level, everywhere inside your app, you can have a set of application-level variables that store something like:

UserDataDir SystemDataDir

etc.

At startup, you'll need to set these, and that may well require platform specific code. One way to do this on Linux (that I've used) is to have a default hard coded (say /usr/local/MyApp/DataDir). I also have the app look for an environment variable, if it's set, then I use that for the DataDir, if not, I use the default. That way, you can deliver a start-up script that sets the appropriate variable, and then starts your app. All your users (or your installer program) have to do is customize the start-up script if they want to install in a non-standard location.

Well, I got a little long winded, but I hope there was something helpful here.

-Chris

-- Christopher Barker, Ph.D. Oceanographer

NOAA/OR&R/HAZMAT (206) 526-6959 voice 7600 Sand Point Way NE (206) 526-6329 fax Seattle, WA 98115 (206) 526-6317 main reception

Chris.Barker at noaa.gov



More information about the Pythonmac-SIG mailing list