你无法直接确定正在执行的主脚本的位置。毕竟,有时脚本根本不是来自文件。例如,它可能来自交互式解释器或仅存储在内存中的动态生成的代码。
但是,由于总是从文件加载模块,因此你可以可靠地确定模块的位置。如果使用以下代码创建模块并将其与主脚本放置在同一目录中,则主脚本可以导入模块并使用该模块定位自身。
some_path / module_locator.py:def we_are_frozen(): # All of the modules are built-in to the interpreter, e.g., by py2exe return hasattr(sys, "frozen")def module_path(): encoding = sys.getfilesystemencoding() if we_are_frozen(): return os.path.dirname(unipre(sys.executable, encoding)) return os.path.dirname(unipre(__file__, encoding))
some_path / main.py:
import module_locatormy_path = module_locator.module_path()
如果你在不同目录中有多个主脚本,则可能需要一个以上的
module_locator副本。
当然,如果你的主脚本是由其他一些工具加载的,而这些工具却不允许你导入与脚本位于同一位置的模块,那么你很不走运。在这种情况下,你所需要的信息根本就不在程序中任何地方。最好的选择是向工具作者提交错误。



