2012-08-29 18 views
5

OS X Lion üzerinde çalışıyorum, python programımda terminalin herhangi bir yerinden bir dosya açmaya çalışıyorum. Benim .bash_profile dosyasına aşağıdaki işlevi belirledik:her yerden açık (dosya)

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

Bu şekilde ben (terminal) benim ~/'farklı bir dizinden benim testprogram çalıştırabilirsiniz. Şimdi

benim ev dizininde değilim, ve programı çalıştırın eğer "testprogram benim ev-klasörden farklı bir dizinde kulüpler yazarsanız, aşağıdaki Ancak

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

çalışacak "terminalde, program başlar ancak test.txt dosyasını bulamıyor.

Python'u her zaman programın çalıştığı konumdan etkilenmeyen aynı konumdaki dosyayı açmanın herhangi bir yolu var mı?

+0

önerirsiniz? –

cevap

8

sen çok platformlu bunu yapmak istiyorsanız ne `testprogram()` işlevi Python programı ile ilgisi var

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

Teşekkürler, bu çok iyi çalıştı! – Noorac

+1

Bu katılım tamamen gereksizdir. "Ama multipl ..." "Dinlenme///path/to.file" içinde yol ayırıcıları olarak eğrileriniz zaten var, bu yüzden "~/rest/of/path/to.file" sorunu nasıl olabilir? –

+0

lol iyi bir nokta ... ayrıca python her zaman// yol ayırıcılarını meh gibi işler: .. P –

8

Giriş klasörünü, .bash_profile'da yaptığınız gibi temsil etmek için tilde'ı kullanın ve os.path.expanduser'u kullanın. Bu Python dışında başka hiçbir işlem yoluyla bir dosyaya atıfta farklı değildir

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

Bunu test ettiniz mi? Benim için işe yaramıyor. –

+1

@JoachimIsaksson: Üzgünüm, 'os.path.expanduser' eklemeyi unutma. –

0

, akrabası bir yerine mutlak bir yol kullanmak gerekir.

Komut dosyasının bulunduğu konuma göre dosyalara başvurmak isterseniz, o anda çalışan modülün yerini bulmak için modülünüzdeki __file__ özniteliğini de kullanabilirsiniz. Ayrıca, bir kabuk işlevini kullanmak yerine, komut dosyanıza bir shebang satırı (#!/usr/bin/env python), chmod +x verin ve PATH ürününüze bir yere koyun.

+0

Burada açıklanan env yöntemini düzenli olarak kullanıyorum. Özel modülleri nasıl kullandığınıza bağlı olarak, PYTHONPATH'inizi de güncellemeniz gerekebilir. – DrSkippy

0

Sadece bir kabuktaki işlevini çalıştırabilir böylece yapabilirsiniz cd ev çalıştırmadan önce:

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

veya kısaltılmış gibi

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

Kullanım tam yolu ya bir

~/folder2/test.txt 
0

Python'da sys.argv[0], komut dosyasının yoluna göre ayarlanacaktır. nown). Bu artı işlevleri, komut dosyasını içeren dizine göre dosyalara erişmek için 'da kullanabilirsiniz. Örneğin

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 sys.argv[0] da tam bir yol olmayabileceğini işaret ediyor. sys.argv[0] kullanmak yerine, bu durumda __file__ kullanabilirsiniz.

+0

'sys.argv [0]', geçerli dizinden betiğe giden yolu vermeyi garanti etmemektedir. Örneğin, betik sadece kullanıcının yolunda olabilir. –

+0

@DavidRobinson, huh, 'pydoc sys' her zaman bir yol adı olduğunu ima eder, ancak http://docs.python.org/library/sys.html bunun olmayacağını söylüyor. Ben de bunun yerine '__file__' kullanmayı önerdim. –

İlgili konular