2012-08-29 35 views
5

在OS X Lion上工作時,我試圖從終端中的任何地方在我的python程序中打開一個文件。我已經設定下面的功能在我的.bash_profile:從任何地方打開(文件)

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

這樣我可以(在終端)運行在不同的目錄我testprogram比我的〜/。

現在,如果我在我的主目錄,並運行程序,下面將工作

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

但是,如果我在從我的主文件夾不同的目錄,並寫上「testprogram 「在終端中,程序啓動但無法找到文件test.txt。

是否有任何方法總是讓python從同一位置打開文件,而不影響我運行程序的位置?

+0

什麼是'testprogram()'函數必須做的Python程序? –

回答

8

如果你想讓它多平臺,我會建議

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

謝謝,這工作得很好! – Noorac

+1

這種連接是完全沒有必要的。 「但多重...」你已經在「rest/of/path/to.file」中有斜槓作爲路徑分隔符,那麼「〜/ rest/of/path/to.file」怎麼會成爲問題呢? –

+0

大聲笑好點...也總是對待'/'作爲路徑分隔符,所以meh ..:P –

8

使用代字符表示主文件夾,就像在.bash_profile中那樣,並使用os.path.expanduser

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

你測試了嗎?似乎不適合我。 –

+1

@JoachimIsaksson:對不起,忘了添加'os.path.expanduser'。 –

0

這與通過除Python以外的任何其他方式引用文件沒有什麼不同,您需要使用絕對路徑而不是相對路徑。

如果您想要參考相對於腳本位置的文件,還可以使用模塊中的__file__屬性來獲取當前正在運行的模塊的位置。

此外,而不是使用shell函數,只要給你的腳本shebang行(#!/usr/bin/env python),chmod +x它,並把它放在你的PATH某處。

+0

我經常使用這裏描述的env方法。根據您使用自定義模塊的方式,您可能還需要更新您的PYTHONPATH。 – DrSkippy

0

你可以簡單地在子shell中運行該功能,因此您可以運行它之前cd家:像

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

或簡稱

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

二者必選其一完整路徑一個

~/folder2/test.txt 
0

python sys.argv[0]將被設置爲腳本的路徑(如果k nown)。您可以使用此功能加上os.path中的功能來訪問與包含該腳本的目錄相關的文件。例如

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+") 

大衛羅賓遜指出,sys.argv[0]可能不是一個完整的路徑名。如果是這種情況,您可以使用__file__而不是sys.argv[0]

+0

'sys.argv [0]'不保證給出從當前目錄到腳本的路徑。例如,腳本可以在用戶的​​路徑上。 –

+0

@DavidRobinson,呵呵,'pydoc sys'暗示它總是一個路徑名,但http://docs.python.org/library/sys.html表示它可能不是。所以我建議使用'__file__'來代替。 –