让一个python脚本始终引用同一个目录,而不管它在系统中的运行位置如何

Have a python script always reference the same directory regardless of where it's run in the system

本问题已经有最佳答案,请猛点这里访问。

我有一个python脚本,它接受文件名作为参数,并对这些文件执行操作。当前脚本与它操作的文件位于同一目录中。但我希望能够在操作系统的任何地方运行我的python脚本。当我将文件名作为脚本的参数时,它应该确切地知道要查找哪个目录,而不管Python脚本在系统中的哪个位置运行。如何在Python中实现这一点?

这是脚本的相关部分。我可以硬编码路径吗?类型映射文件将是作为参数传递到脚本中的文件名。

1
2
3
4
5
6
7
8
data = None
with open (type_mapping_file,"r") as myfile:
    data=myfile.read()

if(data is not None):
    request_params = {'type': type_name, 'index': index_name}

    send_http_request("/index/type/create", request_params, base_url, post_body=data)

提前谢谢。


我假设您正在寻找一种方法来找到通过相对路径给出的路径,可能从另一个位置调用脚本本身。

1
2
3
4
5
$ cat print_path.py
import os
import sys

print os.path.abspath(sys.argv[1])

如果您在相对路径上调用这个脚本,它将打印绝对路径,这样您就可以在磁盘上找到它。魔法来自于os.path.abspath()

1
2
3
$ python print_path.py ./planning.md
/Users/Gijs/Desktop/planning.md
$ cd ..

如果你是从别的地方打来的。

1
2
$ python Desktop/print_path.py Desktop/planning.md
/Users/Gijs/Desktop/planning.md

编辑

不,等等,您正在寻找执行的python文件的位置。在__file__中,看如何获取当前正在执行的文件的路径和名称?.


它怎么知道呢?

如果它是一个常量路径,可以将其硬编码到脚本中,然后使用os.path构建完整路径:

1
2
3
4
5
6
import os
import sys

BASE_PATH = '/my/const/path'

fullpath = os.path.join(BASE_PATH,sys.argv[1])

尽管如注释中所述,更灵活的解决方案是将路径作为单独的参数传递,或者为每个文件传递绝对路径。


当前文件的完整路径是一个称为__file__的魔力变量。这是一个适用于类似于os.path.dirname()的函数的参数:

1
print("This Python file is in" + os.path.dirname(__file__))

然后,您可以使用命令行上提供的参数来执行os.path.join()操作,以获取与脚本位于同一目录中的文件(无论在何处)。

请注意,以这种方式使用__file__并不适合于可重用的包。最好使用pkgutil.get_data()或等效的设置工具功能。基本上,您给它传递一个模块或包名称(通常是__name__、当前模块的名称,或者__package__,您所在包的名称),它会为您检索文件。如果您的模块要进入一个可导入的zip文件或其他不存在__file__或没有有用值的地方,则需要这样做。