此问题在此处已有答案:
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
这样的主目录呢?
1条答案
按热度按时间8cdiaqws1#
我想通了!:
解释
__file__
包含脚本的文件路径,所以我们可以通过路径分隔符(/
或os.sep
)将其拆分,并读入我们需要的前几个组件。为了帮助理解这是如何工作的,请看上面的输出,您可以看到路径是如何被分割的,以及各个路径组件在
script_path_list
中的位置:参考文献
1.非常有用:How to split a dos path into its components in Python
__file__
variable mean/do?