2012-04-03 20 views
6

Esiste un modo portatile per eseguire uno script Python da una shell senza scrivere il percorso completo?Come eseguire uno script Python in modo flessibile senza specificare il percorso completo

Per esempio in Linux, mi piacerebbe, mentre nella mia home directory

cd ~ 

per essere in grado di eseguire uno script python chiamato run.py che è in diciamo, ~/lungo/path/to/run .py, ma voglio farlo funzionare semplicemente digitando

python run.py 

invece di

python ~/long/path/to/run.py 

vorrei sperare in un qualche tipo di sé lista dei percorsi di arco che contiene diverse directory proprio come la variabile PATH, in modo che python run.py esegua il primo run.py che incontra in una delle directory.

Ho pensato di trasformare run.py in un file eseguibile e aggiungere la sua directory alla variabile PATH di sistema, ma non ho trovato un modo portatile per rendere eseguibile un eseguibile python.

EDIT

Un anno più tardi dopo aver chiesto, io sono un po 'meno niubbo, e vedo che la mia domanda non era molto chiaro e non aveva molto senso, quindi dopo una domanda upvote io chiarire alcune cose.

1) Portatile.

Quando ho chiesto questo ho detto portatile. Tuttavia, ciò che significa portatile non è chiaro in questo caso, e non ho dato molta enfasi ad esso.

  • le piattaforme: dovrebbe funzionare su POSIX (Linux, MacOS, ecc) e Windows

  • questo ancora non ha molto senso in quanto Windows utilizza cmd.exe, e POSIX usa sh, così ognuno poteva eseguire i comandi con una sintassi diversa. Quindi diciamo che la cosa più portatile possibile sarebbe quella di alimentare lo stesso input sia a sh sia a , eseguendo lo script python in entrambi i casi. In questo caso, è possibile eseguire lo stesso comando da una funzione ANSI C system, che utilizza sh su POSIX e cmd su Windows. ANSI C è una delle poche cose che è comune a Windows e POSIX, la domanda ha un senso in quel caso.

2) eseguibile

Avanti, la frase turning run.py into an executable, non è molto chiaro. Con ciò stavo parlando della strategia Linux di chmod +x run.py, aggiungi uno shebang #!/usr/bin/env python e aggiungendo la sua directory il sistema aggiunge ~/long/percorso/alla variabile di ambiente PATH. Ma questo non funzionerà per Windows perché Windows non supporta una proprietà di metadati di file eseguibili come Linux e perché/usr/bin/env non esiste necessariamente in Windows.

3) Estensione

Infine, nella mia testa speravo per una soluzione che non specifica che tipo di corsa file è, in modo che se un giorno decidiamo di farlo, ad esempio, un file Perl, non le interfacce cambierebbero.

Pertanto, scrivere run.py non sarebbe corretto perché dovrebbe specificare il tipo di file; sarebbe meglio essere in grado di scrivere solo run

risposta

14

Se la directory che contiene run.py è nel percorso di ricerca del modulo (ad esempio, PYTHONPATH variabile d'ambiente), si dovrebbe essere in grado di eseguire in questo modo:

python -m run 

Ecco la documentazione sulla linea -m di comando opzione:

-mmodule-name
Ricerche sys.path per il modulo nominato ed esegue il file .py corrispondente come script.

+0

Grazie FJ, questo è esattamente quello che stavo cercando, lo sento che ha due vantaggi rispetto al '#!' approccio: 2 –

+0

(specifico Scusa, commento a metà) ... Grazie a F.J, questo è quello che stavo cercando, sento che ha due vantaggi rispetto al '#!' approccio: 1) non ingombrare gli script 2) non ingombrare la variabile PATH globale e utilizzare invece il PYTHONPATH più specifico. Lo svantaggio è ovviamente dover digitare "python -m" tutto il tempo, che occupa spazio e peggio, potrebbe significare riscrivere il codice se decidessi mai un giorno di trasformare i tuoi script python in, per esempio, script di bash. –

+0

Ho provato Python -m, ma non ha funzionato ... Sono sicuro che run.py si trova in PYTHONPATH poiché posso importarlo e mostra quando importare sys; print sys.path ... mi manca qualcosa? –

4

Si può fare un eseguibile script python aggiungendo

#!/usr/bin/env python 

all'inizio del file, e che lo rende eseguibile con chmod +x.

+0

Grazie alberge, non ero sicuro che funzioni su Windows, ma sembra che #!/Usr/bin/env python sarà trattato come un commento, e l'installazione python associa automaticamente i file .py in esecuzione con l'interprete python. Questo è particolarmente bello se metti .py nel tuo EXTPATH, così puoi eseguire i file python semplicemente digitando "run" invece di "run.py", il che significa che se decidi di trasformare i tuoi script python in Perl, non è necessario riscrivere le chiamate di script. Sarebbe bello se ci fosse un modo semplice per eseguire script in Linux senza scrivere l'estensione e senza aggiungere #! ... –

+0

Questo funziona perfettamente con virtualenv – Henrik

0
  1. file di python Marchio eseguibile (come "alberge" indicato sopra)
  2. Creare una directory e mettere questa directory in PATH variabile
  3. In questa directory, creare collegamenti ai propri script python
1

risposta dopo la modifica chiarimento

preferisco il seguente approccio a quello suggerito da @ F.J. perché non richiede agli utenti di specificare il tipo di file. Si prega di notare che questo non era specificato nella domanda originale, quindi la sua risposta alla domanda originale era corretta.

Consente di chiamare il file pytest.py per evitare conflitti con un possibile programma esistente run.

On POSIX (MacOs, Linux) fare quello che ha detto @Petr, che si basa su ciò che @alberge detto:

  • chmod +x
  • aggiungere la baracca #!/usr/bin/env python
  • creare una directory e aggiungerlo al percorso . posizioni usuali su Linux sono: ~/bin/per un singolo utente, /usr/local/bin/ per tutti gli utenti
  • link simbolico (cp -s) il file con vostro percorso con nome base pytest invece di pytest.py

Su Windows:

  • crea una dir e aggiungila a PATH. AFAIK, non esiste un luogo convenzionale per questo, quindi perché non lo è C:\bin\ e ~\bin\?
  • aggiungere .PY alla variabile PATHEXT ambiente in modo che Windows riconoscerà i file con estensione python come file eseguibili senza che sia necessario digitare l'estensione
  • file python
  • associare il python.exe interprete (Windows Explorer> tasto destro> selezionare "Usare sempre il programma selezionato "). C'è un'opzione sul programma di installazione di Python che fa questo per te.
  • collegamento simbolico pytestcon estensione nella dir sotto PATH (utilizzando link Shell Extension da Windows Explorer o mklink name dest da cmd)

Ora system("pytest"); dovrebbe funzionare in entrambi i sistemi (sh sotto Linux, cmd sotto Windows)

Problemi correlati