【发布时间】:2010-09-23 15:47:30
【问题描述】:
我有一个 python 模块在我的几个项目之间共享(每个项目都有不同的工作目录)。此共享模块中的功能之一是使用 os.spawn 执行脚本。问题是,我不确定应该给 os.spawn 提供什么路径名,因为我不知道调用该函数时当前的工作目录是什么。如何以任何调用者都可以找到的方式引用该文件?谢谢!
【问题讨论】:
标签: python file relative-path
我有一个 python 模块在我的几个项目之间共享(每个项目都有不同的工作目录)。此共享模块中的功能之一是使用 os.spawn 执行脚本。问题是,我不确定应该给 os.spawn 提供什么路径名,因为我不知道调用该函数时当前的工作目录是什么。如何以任何调用者都可以找到的方式引用该文件?谢谢!
【问题讨论】:
标签: python file relative-path
所以我刚刚了解了__file__ 变量,它将为我的问题提供解决方案。我可以使用 file 来获取一个在所有项目中都是不变的路径名,并使用它来引用我需要调用的脚本,因为该脚本将始终位于相对于 __file__ 的相同位置.但是,如果有人有其他/更好的方法,我愿意接受。
【讨论】:
__file__。编辑器中还有一个按钮(看起来像“101\n010”)可以做同样的事情。
os.path.abspath(__file__)来获取模块的完整路径,这样以后CWD的任何更改都不会破坏它。
将它放在一个众所周知的目录中(/usr/lib/yourproject/ 或 ~/lib 或类似的东西),或者根据使用它的源文件的位置将它放在一个众所周知的相对路径中。
【讨论】:
以下代码将找到调用模块的位置,这从程序员的角度来看是有意义的:
## some magic to allow paths relative to calling module
if path.startswith('/'):
self.path = path
else:
frame = sys._getframe(1)
base = os.path.dirname(frame.f_globals['__file__'])
self.path = os.path.join(base, path)
即如果您的项目位于 /home/foo/project 中,并且您想在 scripts/ 中引用脚本“myscript”,则可以简单地传递“scripts/myscript”。 sn-p 会找出调用者在 /home/foo/project 中,并且整个路径应该是 /home/foo/projects/scripts/myscript。
或者,您始终可以要求程序员指定完整路径,并使用 os.path.exists 检查它是否存在。
【讨论】:
您可能会在 cross platform application development and distribution 上的 PyCon 2010 演示文稿中找到有用的材料。他们解决的问题之一是跨平台一致地查找数据文件以及代码的已安装与开发检查。
【讨论】: