如何指示脚本的当前目录不是我? [复制]
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`。