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?
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
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
correlati: [Come ottengo il percorso del file attualmente eseguito in python?] (Http://stackoverflow.com/q/2632199/4279) – jfs