9

在 OS X Lion 上工作,我试图从终端的任何地方打开我的 python 程序中的文件。我在 .bash_profile 中设置了以下函数:

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

这样我就可以(在终端中)从不同于我的 ~/.

现在,如果我在我的主目录中并运行该程序,则以下内容将起作用

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

但是,如果我在与我的主文件夹不同的目录中并在终端中写入“testprogram”,程序会启动但无法找到文件 test.txt。

有什么方法可以让 python 从不受我运行程序的位置影响的相同位置打开文件?

4

6 回答 6

12

如果你想让它成为多平台,我会推荐

import os
open(os.path.join(os.path.expanduser('~'),'rest/of/path/to.file'))
于 2012-08-29T18:27:54.020 回答
11

使用波浪号来表示主文件夹,就像在 , 中一样.bash_profile,然后使用os.path.expanduser.

import os
infile = open(os.path.expanduser("~/folder2/test.txt"), "r+")
于 2012-08-29T18:24:02.433 回答
0

这与通过 Python 之外的任何其他方式引用文件没有什么不同,您需要使用绝对路径而不是相对路径。

如果您想引用相对于脚本位置的文件,您还可以使用__file__模块中的属性来获取当前正在运行的模块的位置。

另外,不要使用 shell 函数,只需给你的脚本一个 shebang 行 ( #!/usr/bin/env python),chmod +x它,然后把它放在你的PATH.

于 2012-08-29T18:24:43.817 回答
0

您可以简单地在子外壳中运行该函数,以便在运行它之前可以cd回家:

function testprogram() { (
    cd && python .folder/.testprogram.py
) }
于 2012-08-29T18:25:18.623 回答
0

在 pythonsys.argv[0]中将设置为脚本的路径(如果已知)。您可以使用它加上函数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+")

David Robinson 指出这sys.argv[0]可能不是一个完整的路径名。如果是这种情况,sys.argv[0]您可以使用而不是使用。__file__

于 2012-08-29T18:27:39.383 回答
-1

使用任一完整路径,例如

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

或缩写一个

~/folder2/test.txt 
于 2012-08-29T18:27:07.137 回答