从Python中的不同工作目录确定文件的路径名

问题描述:

我有一个在我的几个项目*享的python模块(每个项目都有不同的工作目录)。这个共享模块中的一个功能是使用os.spawn执行脚本。问题是,我不知道什么路径名给os.spawn,因为我不知道什么时候该函数被调用当前的工作目录。我如何以任何呼叫者可以找到的方式引用文件?谢谢!从Python中的不同工作目录确定文件的路径名

因此,我刚刚了解到__file__变量,它将为我的问题提供解决方案。我可以使用文件来获取所有项目中不变的路径名,并使用它来引用我需要调用的脚本,因为脚本总是位于相对于__file__的相同位置。但是,如果有人拥有这些方法,我愿意接受其他/更好的方法。

+0

你的意思是'__file__',所以SO标记使它变得粗体。 – 2010-09-23 15:54:45

+0

通过在字符串周围加反引号('),可以将__file__更改为'__file__'。在编辑器中还有一个按钮(它看起来像“101 \ n010”)来做同样的事情。 – unutbu 2010-09-23 15:59:41

+0

通常最好使用'os.path.abspath(__ file __)'来获取模块的完整路径,以便以后CWD中的任何更改都不会中断它。 – bobince 2010-09-23 16:03:31

把它放在一个众所周知的目录(/ 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中,并且您想在脚本/中引用脚本'myscript',则只需传递'scripts/myscript'即可。这段代码会发现调用者在/ home/foo/project中,整个路径应该是/ home/foo/projects/scripts/myscript。

或者,您可以随时要求程序员指定完整路径,并使用os.path.exists(如果存在)进行检查。

你可能会发现这个PyCon 2010演示文稿中的材料对cross platform application development and distribution有用。他们所要解决的问题之一是在各个平台上一致地查找数据文件,并且在代码的安装与开发签出中查找数据文件