Praca w OS X Lion, staram się otworzyć plik w moim programie Python z dowolnego miejsca w terminalu. Ustawiłem następującą funkcję w moim. Bash_profile:

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

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

Teraz, jeśli jestem w moim katalogu domowym, a uruchom jestem program, działał

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

Jeśli jednak jestem w innym katalogu z mojego home-folderu i piszę "testprogram" w terminalu, program rozpocznie się, ale nie jest w stanie znaleźć testu pliku.txt.

Czy jest jakiś sposób, aby zawsze mieć Python otworzyć plik z tej samej lokalizacji, w której prowadzę program?

9
Noorac 29 sierpień 2012, 22:21

6 odpowiedzi

Najlepsza odpowiedź

Jeśli chcesz to zrobić multiplatform, polecam

import os
open(os.path.join(os.path.expanduser('~'),'rest/of/path/to.file'))
12
Joran Beasley 29 sierpień 2012, 18:27

Użyj tilde, aby reprezentować folder domowy, tak jak w .bash_profile i użyj os.path.expanduser.

import os
infile = open(os.path.expanduser("~/folder2/test.txt"), "r+")
11
David Robinson 29 sierpień 2012, 18:30

Nie jest to inne niż odnoszące się do pliku za pośrednictwem czegoś innego poza Python, musisz użyć bezwzględnej ścieżki, a nie względnej.

Jeśli chcesz odnieść się do plików w stosunku do lokalizacji skryptu, można również użyć atrybutu __file__ w module, aby uzyskać lokalizację aktualnie uruchomionego modułu.

Również, zamiast używać funkcji powłoki, po prostu podaj swój skrypt linia shebang (#!/usr/bin/env python), chmod +x i umieść go gdzieś na swoim PATH.

0
Julian 29 sierpień 2012, 18:24

Możesz po prostu uruchomić funkcję w Subshell, dzięki czemu możesz cd do domu przed uruchomieniem:

function testprogram() { (
    cd && python .folder/.testprogram.py
) }
0
kojiro 29 sierpień 2012, 18:25

W Pythonie sys.argv[0] zostanie ustawiony na ścieżkę skryptu (jeśli jest znany). Możesz użyć tego funkcji w os.path, aby uzyskać dostęp do plików w stosunku do 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 wskazuje, że sys.argv[0] może nie być pełną ścieżką. Zamiast używać sys.argv[0] możesz użyć __file__, jeśli tak jest.

0
Geoff Reedy 29 sierpień 2012, 18:38

Użyj pełnej ścieżki jak

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

Lub skrócony jeden

~/folder2/test.txt 
-1
Maksym Polshcha 29 sierpień 2012, 18:27