2012-08-29 8 views
5

OS X Lionで作業していますが、私は自分のPythonプログラムで端末のどこからでもファイルを開こうとしています。私は自分の.bash_profileに以下の機能を設定していますどこからでも開く(ファイル)

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

この方法で私は(ターミナルで)私の〜/とは異なるディレクトリからの私testprogramを実行することができます。私は自分のホームディレクトリにいるよ、とプログラムを実行する場合

さて、次は

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

を働くだろうしかし、私は私のホームフォルダから別のディレクトリにいると「testprogramを書く場合"ターミナルでは、プログラムは起動しますが、test.txtファイルを見つけることができません。

私はどこからプログラムを実行するのに影響を受けない同じ場所からファイルを開くことができるのですか?

+0

を勧めますか? –

答えて

8

あなたはマルチプラットフォームにそれを作りたい場合は、私は何 `testprogram()`関数はPythonプログラムとしなければならない

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

lol良い点...また、pythonは常に '/'をパス区切り文字として扱いますので、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__属性を使用して、現在実行中のモジュールの場所を取得することもできます。

また、シェル関数を使用するのではなく、スクリプトにシバン行(#!/usr/bin/env python)、chmod +xを付けて、PATHに置いてください。

+0

ここでは定期的に説明しているenvメソッドを使用します。カスタムモジュールの使い方によっては、PYTHONPATHも更新する必要があります。 – DrSkippy

0

あなたはそれを実行する前にcd自宅できるようにするには、単にサブシェルで関数を実行できます。

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

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

または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]はフルパス名ではないかもしれないと指摘しています。この場合はsys.argv[0]の代わりに__file__を使用できます。

+0

'sys.argv [0]'は現在のディレクトリからスクリプトへのパスを与えることは保証されていません。たとえば、スクリプトはユーザーのパス上にある可能性があります。 –

+0

@DavidRobinson、 '' pydoc sys'は、常にパス名であることを意味しますが、http://docs.python.org/library/sys.htmlにはそうではないと言われています。ですから、代わりに '__file__'を使うことを提案しました。 –

関連する問題