2013-10-28 12 views
10

Ho uno script python eseguibile che esiste in una directory "scripts" e c'è un collegamento simbolico a quello script (utilizzato per avviare il file) in una directory radice. Qualcosa di simile:Avvio di uno script python tramite un collegamento simbolico

. 
├── scripts 
│ ├── const.py 
│ ├── fops.py 
│ ├── i_build.py 
│ └── i_Props.ini 
└── build_i -> scripts/i_build.py 

Mi piacerebbe essere in grado di lanciare/eseguire i miei script via:

python build_i 

Dalla directory principale. Lo script i_build.py tenterà di aprire i_Props.ini e fare un po 'di magia in base a ciò che è lì dentro.

Il problema è che quando lo script i_build.py viene avviato tramite il collegamento simbolico nella directory root, lo script i_build.py cercherà nella directory root per gli altri file (non nella directory/scripts in cui i_build.py è immagazzinato).

Il file i_build.py ha gli oggetti di scena come file Luogo:

PROP_FILE = "i_Props.ini" 

e tenta di aprire questo, e poi fallisce. Non voglio hardcode un percorso per ovvi motivi.

Un test rapido che aggiunge os.getcwd() nel file principale conferma i miei sospetti che esso pensi che il CWD sia la directory principale e un controllo di __file__ dice che è il collegamento simbolico ("build_i").

C'è qualcosa che posso fare per fare in modo che Python usi la destinazione del simbolico come per il nome __file__ e CWD?

+0

Probabilmente si potrebbe monitorare il filesystem usando kqueue/qualunque cosa abbiano sugli altri sistemi operativi. La cosa che alla fine distingue le due posizioni potrebbe essere l'inode che avvia l'esecuzione. Niente di tutto ciò è esposto in modo molto chiaro senza scavare un po '... L'unica altra cosa che posso pensare sarebbe un hard link piuttosto che un link soft, ma sto pensando che potrebbe avere l'effetto opposto del tutto. Ci sono un paio di trucchetti che potresti fare, credo che la shell di Z abbia un aggancio 'prima di lanciare il programma' che potrebbe alimentare il tuo vero cwd alla sceneggiatura come arg? ... – synthesizerpatel

+0

Questo non è degno di una risposta, quindi io ' m commentando Si può leggere il link simbolico usando 'os.readlink()', ed eseguire lo script dal risultato con 'subprocess.Popen()'. Un po 'goffo ma fa il lavoro come nulla è codificato e non aggiunge dipendenze. – ThinkChaos

+0

correlati: [Come ottengo il percorso del file attualmente eseguito in python?] (Http://stackoverflow.com/q/2632199/4279) – jfs

risposta

1

solo alcune possibilità vengono in mente:

  1. Nella directory principale dispone di un file di shell che chiama il tuo pitone sceneggiatura di percorso esplicito.
  2. Aggiungi la directory in cui si trova sul tuo percorso.
  3. particolare aggiungere la directory a sys.path
+0

L'opzione 1 potrebbe essere il mio lavoro in giro ... 2 e 3 sono essenzialmente ancora hardcoding.Ho bisogno di evitare tutto ciò che comporta passi extra in quanto questo è distribuito a un numero di persone, meno gli oggetti che sono incasinati e meglio è. – Mike

+0

Su Linux se si aggiunge lo script di bash in/etc o in/bin o in/usr/etc allora sarà eseguibile senza dare un percorso. –

13

È possibile utilizzare __file__, ma è necessario prendere alcune precauzioni per ottenere il vero e proprio percorso:

import os 
base_dir = os.path.dirname(os.path.realpath(__file__)) 

Poi caricare altri file/risorse relativa to base_dir:

some_subdir = 'my_subdir' 
some_file = 'my.ini' 

ini_path = os.path.join(base_dir, some_subdir, some_file) 
+1

['__file__' può essere indefinito] (http://stackoverflow.com/q/2632199/4279) potresti [fallback su' sys.argv [0] 'in questo caso] (https://bitbucket.org/ PyPy/PyPy/src/a299cd0a893f/PyPy/strumento/autopath.py? a = default # cl-29) – jfs

Problemi correlati