在OS X Lion上工作,我正试图从终端的任何地方在我的python程序中打开一个文件。我在.bash_profile中设置了以下函数:
function testprogram() {python ~/.folder/.testprogram.py}
这样我就可以(在终端中)从不同的目录运行我的测试程序〜/。
现在,如果我在我的主目录中并运行该程序,则以下操作
infile = open("folder2/test.txt", "r+")
但是,如果我与我的主文件夹位于不同的目录并在终端中写入“testprogram”,则程序启动但无法找到文件test.txt。
有没有办法让python从不受我运行程序的位置的相同位置打开文件?
答案 0 :(得分:10)
如果你想让它成为多平台我会推荐
import os
open(os.path.join(os.path.expanduser('~'),'rest/of/path/to.file'))
答案 1 :(得分:9)
使用代字号表示主文件夹,就像使用.bash_profile
一样,并使用os.path.expanduser
。
import os
infile = open(os.path.expanduser("~/folder2/test.txt"), "r+")
答案 2 :(得分:0)
这与通过除Python之外的任何其他内容引用文件没有什么不同,您需要使用绝对路径而不是相对路径。
如果您想引用相对于脚本位置的文件,您还可以使用模块中的__file__
属性来获取当前正在运行的模块的位置。
此外,不要使用shell函数,只需为脚本提供一个shebang行(#!/usr/bin/env python
),chmod +x
,然后将其放在PATH
上。
答案 3 :(得分:0)
您可以在子shell中运行该函数,以便在运行之前cd
回家:
function testprogram() { (
cd && python .folder/.testprogram.py
) }
答案 4 :(得分:0)
在python sys.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__
。
答案 5 :(得分:-1)
使用
之类的完整路径/path/to/my/folder2/test.txt
或缩写为
~/folder2/test.txt