linux Python:获取正在运行的脚本所在的用户主目录的路径[duplicate]

mwecs4sa  于 2022-12-18  发布在  Linux
关注(0)|答案(1)|浏览(185)

此问题在此处已有答案

How do I get the path and name of the file that is currently executing?(26个答案)
3天前关闭。
我不认为这个问题(How do I get the path and name of the file that is currently executing?)和this one都不是我的副本,因为它们的答案都是__file__。我的问题和情况更复杂,应该有一个独立的谷歌搜索空间。我正在寻找脚本所在路径的主目录,结果(也许这甚至不是唯一的解决方案,因为这是解决方案的细节,而不是问题的描述),而不仅仅是脚本所在的路径。我的问题的背景非常独特(以root身份运行脚本,但需要脚本所在的另一个用户的文件系统的主目录),值得特别注意,因为其他人也会遇到它,我敢肯定。
我有a Python script位于/home/gabriel/dev/cpu_logger.py中。在其中我登录到/home/gabriel/cpu_log.log。我使用pathlib.Path.home()在脚本中获得/home/gabriel部分,如下所示。我使用该部分作为log_file_path的目录:

import pathlib

home_dir = str(pathlib.Path.home())
log_file_path = os.path.join(home_dir, 'cpu_log.log')

但是,我现在需要以root身份运行脚本,以允许它设置一些受限制的文件权限,因此我使用crontab following these instructions here将它配置为在 Boot 时以root身份运行。**现在,由于它以root身份运行,上面的home_dir变为/root,因此log_file_path变为/root/cpu_log.log。**这不是我想要的!我想要它记录到/home/gabriel/dev/cpu_logger.py

我该怎么做呢?
但是,我不想显式地设置该路径,因为我打算让其他人使用此脚本,所以不能硬编码它。
我考虑过将主用户的用户名作为第一个参数传递给程序,然后使用os.path.expanduser("~" + username)获取该用户的home_dir

import os
import sys

username = sys.argv[1]
home_dir = os.path.expanduser("~" + username)

...但是如果没有必要,我不想传递像这样的额外参数。即使这个脚本是在root用户下运行的,我怎么才能获得/home/gabriel这样的主目录呢?

8cdiaqws

8cdiaqws1#

我想通了!:

script_path_list = os.path.normpath(__file__).split(os.sep)
home_dir = os.path.join("/", script_path_list[1], script_path_list[2])

解释

__file__包含脚本的文件路径,所以我们可以通过路径分隔符(/os.sep)将其拆分,并读入我们需要的前几个组件。

import os

# Obtain the home dir of the user in whose home directory this script resides
script_path_list = os.path.normpath(__file__).split(os.sep)
home_dir = os.path.join("/", script_path_list[1], script_path_list[2])

# print the results
print("__file__         = {}".format(__file__))
print("script_path_list = {}".format(script_path_list))
print("home_dir         = {}".format(home_dir))

为了帮助理解这是如何工作的,请看上面的输出,您可以看到路径是如何被分割的,以及各个路径组件在script_path_list中的位置:

__file__         = /home/gabriel/GS/dev/eRCaGuy_dotfiles/useful_scripts/cpu_logger.py
script_path_list = ['', 'home', 'gabriel', 'GS', 'dev', 'eRCaGuy_dotfiles', 'useful_scripts', 'cpu_logger.py']
home_dir         = /home/gabriel

参考文献

1.非常有用:How to split a dos path into its components in Python

  1. what does the __file__ variable mean/do?

相关问题