2012-08-29 12 views
5

Praca na OS X Lion, próbuję otworzyć plik w moim programie Pythona z dowolnego miejsca w terminalu. Mam ustawiony następującą funkcję w moim bash_profile:Otwórz (plik) z dowolnego miejsca

function testprogram() {python ~/.folder/.testprogram.py} 

ten sposób mogę (w terminalu) uruchomić mój testprogram z innego katalogu niż mojego ~ /.

Teraz, gdy jestem w moim katalogu domowym i uruchom program dodaje będzie działać

infile = open("folder2/test.txt", "r+") 

Jednakże, jeśli jestem w innym katalogu z moim domowym katalogu i napisać „testprogram "w terminalu program się uruchamia, ale nie może znaleźć pliku test.txt.

Czy istnieje sposób, aby zawsze mieć Pythona otworzyć plik z tej samej lokalizacji, bez wpływu na miejsce uruchomienia programu?

+0

Co oznacza 'testprogram()' funkcja ma wspólnego z programem Pythona? –

Odpowiedz

8

Jeśli chcesz zrobić to wieloplatformowy Polecam

import os 
open(os.path.join(os.path.expanduser('~'),'rest/of/path/to.file')) 
+0

Dzięki, to działało bardzo dobrze! – Noorac

+1

To połączenie jest całkowicie niepotrzebne. "Ale mnożenie ..." Masz już ukośniki jako separatory ścieżek w "reszta/z/ścieżka/do pliku", więc jak mógłby "~/rest/of/path/to.file" być problem? –

+0

lol dobry punkt ... również python zawsze traktuje '/' jako separatory ścieżek, więc meh ..: P –

8

Użyj tyldy do reprezentowania folderu domowego, tak jak w przypadku .bash_profile i użyj os.path.expanduser.

import os 
infile = open(os.path.expanduser("~/folder2/test.txt"), "r+") 
+0

Testowałeś to? Wydaje się nie działać dla mnie. –

+1

@JoachimIsaksson: Przepraszamy, zapomniałem dodać 'os.path.expanduser'. –

0

Nie różni się to od powoływania się na plik za pomocą czegokolwiek innego niż Python, należy użyć bezwzględnej ścieżki, a nie względnej.

Jeśli chcesz odnieść się do plików związanych z lokalizacją skryptu, możesz również użyć atrybutu __file__ w swoim module, aby uzyskać lokalizację aktualnie uruchomionego modułu.

Ponadto, zamiast używać funkcji powłoki, po prostu daj swojemu skryptowi linię shebang (#!/usr/bin/env python), chmod +x i umieść ją w innym miejscu na swoim PATH.

+0

Używam opisywanej tu metody env. W zależności od tego, w jaki sposób korzystasz z modułów niestandardowych, może być konieczna aktualizacja PYTHONPATH. – DrSkippy

0

Można po prostu uruchomić funkcję w podpowłoce więc można cd domu przed uruchomieniem go:

function testprogram() { (
    cd && python .folder/.testprogram.py 
) } 
-1

użyć albo pełną ścieżkę jak

/path/to/my/folder2/test.txt 

lub skracane jeden

~/folder2/test.txt 
0

W pytonie sys.argv[0] zostanie ustawione na ścieżkę skryptu (jeśli k nown). Możesz użyć tego oraz funkcji w os.path, aby uzyskać dostęp do plików względem katalogu zawierającego skrypt. Na przykład

import sys, os.path 

script_path = sys.argv[0] 
script_dir = os.path.dirname(script_path) 

def script_relative(filename): 
    return os.path.join(script_dir, filename) 

infile = open(script_relative("folder2/test.txt"), "r+") 

David Robinson zauważa, że ​​sys.argv[0] nie może być pełna ścieżka. Zamiast używać sys.argv[0] możesz użyć __file__, jeśli tak jest.

+0

'sys.argv [0]' nie gwarantuje, że ścieżka z bieżącego katalogu do skryptu. Na przykład skrypt może znajdować się na ścieżce użytkownika. –

+0

@DavidRobinson, huh, 'pydoc sys' oznacza, że ​​zawsze jest to nazwa ścieżki, ale http://docs.python.org/library/sys.html mówi, że może nie być. Dlatego zaproponowałem użycie '__file__'. –

Powiązane problemy