How to indicate the current directory of the script not me?
我有一个python脚本,它从一个文件中读取一些输入,这个文件应该在脚本的同一个目录中:
1 2 3
| with open('./input1.txt') as file:
F = file.readlines()
Do_Stuff(F) |
我通常从其他目录(而不是脚本和输入文件所在的目录)运行脚本,因此它会引发一个IOERROR,使它找不到输入文件(因为它不在我当前的工作目录中)。我不喜欢为输入文件放一个完整的路径,因为我希望它是可移植的——只有脚本和输入文件必须在同一个目录中。
是否有方法指示脚本在其位置目录中查找,而不是从中启动它的目录?
- 获取正在运行的python文件的绝对路径,并用于打开文件!
- 使用文件input1.txt的完整路径,将在启动此脚本的任何位置工作。如果ful路径是用户可配置的,请将其放在单独的配置文件中,然后读取它。由于您试图打开("./input1.txt"),操作系统将始终在当前目录中查找
- 相关:如何在python中获取当前执行文件的路径?
__file__是脚本的路径,尽管通常是相对路径。用途:
1 2 3
| import os.path
scriptdir = os.path.dirname(os.path.abspath(__file__)) |
要创建目录的绝对路径,请使用os.path.join()打开文件:
1
| with open(os.path.join(scriptdir, './input1.txt')) as openfile: |
- 它仍然返回我所在的路径,而不是脚本所在的位置…
- @你的剧本写得怎么样?python path/to/script.py将__file__设置为path/to/script.py(如相对路径)。上面的代码将把它转换成一条绝对路径。运行脚本时,从不同的命令行(local dir、another dir等)打印__file__以查看更改内容。我以前用过很多次,它不只是使用当前的工作目录。
- 根据docs.python.org/2/library/os.path.html_os.path.abspath,它相当于使用当前工作目录的normpath(join(os.getcwd(), path))。
- @Amyassin:os.path.abspath()将使用os.getcwd()将相对路径设为关闭,是的,但这并不意味着它是等效的。normpath(join(os.getcwd(), '../../foo/bar/baz'))与os.getcwd()的路径不同。
- 嗯,我已经测试过了。让os.path.dirname(os.path.abspath('__file__'))返回我执行的CWD,而不是它的位置。
- @艾默辛:那么,埃多克斯1〔11〕给了你什么?
- 好吧,问题是我得做os.path.abspath(__file__),而不是os.path.abspath('__file__')
- @啊,哎呀,那确实是我的错。对不起!
如果安装了setuptools/distribute,则可以使用pkg_resources函数访问文件:
1 2 3
| import pkg_resources
data = pkg_resources.resource_string(__name__, 'input1.txt') |