如何指示脚本的当前目录不是我? [复制]

Posted

技术标签:

【中文标题】如何指示脚本的当前目录不是我? [复制]【英文标题】:How to indicate the current directory of the script not me? [duplicate] 【发布时间】:2013-03-06 15:55:42 【问题描述】:

我有一个 python 脚本,它从应该位于脚本同一目录中的文件中读取一些输入:

with open('./input1.txt') as file:
    F = file.readlines()
Do_Stuff(F)

我通常从其他目录(不是脚本和输入文件所在的目录)运行脚本,因此它会引发一个 IOError,它无法找到输入文件(因为它不在我当前的工作目录中)。我不喜欢为输入文件设置完整路径,因为我希望它是可移植的——只有脚本和输入文件必须位于同一目录中。

有没有办法指示脚本在其位置目录而不是我启动它的目录中查找?

【问题讨论】:

获取正在运行的python文件的绝对路径并用来打开你的文件! 使用文件 input1.txt 的完整路径,将在您启动此脚本的任何位置工作。如果 ful-path 是用户可配置的,请将其放在单独的配置文件中,然后读取它。由于您尝试打​​开 ('./input1.txt'),操作系统将始终查看当前目录 相关:How do I get the path of the current executed file in python? 【参考方案1】:

__file__ 是脚本的路径,尽管通常是相对路径。使用:

import os.path

scriptdir = os.path.dirname(os.path.abspath(__file__))

创建目录的绝对路径,然后使用os.path.join() 打开文件:

with open(os.path.join(scriptdir, './input1.txt')) as openfile:

【讨论】:

它仍然返回我所在的路径,而不是脚本所在的位置... @amyassin:你是如何运行脚本的? python path/to/script.py 会将 __file__ 设置为 path/to/script.py(例如相对路径)。上面的代码把它变成/full/path/to,一个绝对路径。当您运行脚本时,从各种不同的命令行(本地目录、另一个目录等)打印__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() 的路径不同。 @amyassin:啊,哎呀,这确实是我的错误。很抱歉!【参考方案2】:

如果安装了 setuptools/distribute;您可以使用pkg_resources functions 访问文件:

import pkg_resources

data = pkg_resources.resource_string(__name__, 'input1.txt')

【讨论】:

以上是关于如何指示脚本的当前目录不是我? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Linux Shell 脚本 复制当前目录的文件到另一个目录

如何设置当前工作目录? [复制]

Linux脚本练习之script041-创建目录 `/tmp/scripts`,切换工作目录至此目录中,复制 `/etc/pam.d` 目录至当前目录,并重命名为 `test`。

如何更改当前光标位置指示器的颜色?

如何检测我运行 shell 脚本的当前目录?

如何读取 adb 设备而不是当前系统上的环境变量? [复制]