Python 获取.py源文件的位置

Python 获取.py源文件的位置,python,Python,假设我在目录e中有一个python文件,如下所示: /a/b/c/d/e/file.py 在目录e下,我有几个文件夹要访问,但如果file.py是从其他任何地方执行的,而不是从文件夹e执行的,则相对路径对我来说不起作用。此外,文件夹e可以位于任何位置,但始终带有一组子文件夹,所以绝对路径将不起作用 首先,是否有任何函数可以获取相对于源文件位置的绝对路径 如果没有,有什么办法解决这个问题吗?抓取使用的命令行并将CWD添加到一起 我这里的问题是,这个文件夹安装在20台不同的机器和操作系统上,我希望它

假设我在目录e中有一个python文件,如下所示:

/a/b/c/d/e/file.py

在目录e下,我有几个文件夹要访问,但如果file.py是从其他任何地方执行的,而不是从文件夹e执行的,则相对路径对我来说不起作用。此外,文件夹e可以位于任何位置,但始终带有一组子文件夹,所以绝对路径将不起作用

首先,是否有任何函数可以获取相对于源文件位置的绝对路径

如果没有,有什么办法解决这个问题吗?抓取使用的命令行并将CWD添加到一起

我这里的问题是,这个文件夹安装在20台不同的机器和操作系统上,我希望它尽可能动态,并且在必须安装它的地方有一些配置和“规则”等等。

我的解决方案是(a)获取.py文件而不是.pyc文件,以及(b)整理符号链接

# in /a/b/c/d/e/file.py
import os
os.path.dirname(os.path.abspath(__file__)) # /a/b/c/d/e
在Linux上工作时,
.py
文件通常被符号链接到另一个位置,
.pyc
文件在符号链接的py文件旁边的目录中生成。为了找到源文件的真实路径,下面是我用来查找源路径的脚本的一部分

try:
    modpath = module.__file__
except AttributeError:
    sys.exit('Module does not have __file__ defined.')
    # It's a script for me, you probably won't want to wrap it in try..except

# Turn pyc files into py files if we can
if modpath.endswith('.pyc') and os.path.exists(modpath[:-1]):
    modpath = modpath[:-1]

# Sort out symlinks
modpath = os.path.realpath(modpath)
在Python+3.4中,使用更方便:

从pathlib导入路径
source\u path=路径(\u文件\u).resolve()
source\u dir=source\u path.parent

注意!在某些计算机上(在Windows 7 64位上可以找到),这会返回.pyc文件而不是.py文件。这实际上从来不是一个特别彻底的解决方案:您也可以使用.pyo文件而不是.pyc文件(尽管这从来都不流行)。现在在Python3中,.pyc文件放在
\uuuu pycache\uuuu
目录中,而不是放在.py文件旁边,因此在Py3K上,解决方案基本上完全崩溃了。感谢您的反馈。在python3中,它可以工作,因为
\uuuu文件\uuuu
似乎总是真正的
.py
路径。