我怎么能得到py2exe中的可执行文件的当前目录?

我在脚本中使用了这一点代码,以跨平台的方式确定它从哪里运行:

SCRIPT_ROOT = os.path.dirname(os.path.realpath(__file__)) 

很简单。 然后,我继续在我的脚本的其他区域使用SCRIPT_ROOT ,以确保一切正确相对。 我的问题发生在我通过py2exe运行时,因为生成的可执行文件没有设置__file__ ,所以我的脚本中断了。 有谁知道如何解决或解决这个问题?

这里是py2exe文档的参考 ,这里是相关的项目:

  • sys.executable被设置为exe文件的完整path名。
  • sys.argv的第一项是可执行文件的完整path名,其余的是命令行参数。
  • sys.frozen只存在于可执行文件中。 它被设置为控制台可执行文件的“console_exe”,无控制台的gui可执行文件的“windows_exe”,以及进程内dll服务器的“dll”。
  • __file__没有定义(你可能想使用sys.argv [0])

从这些文档中不清楚“exe文件”和“可执行文件”是否是相同的东西,因此sys.executablesys.argv[0]是否是相同的东西。 看上面的script.py和py2exe_executable.exe工作的代码,我不得不这样做,我发现这样的:

 if hasattr(sys, 'frozen'): basis = sys.executable else: basis = sys.argv[0] required_folder = os.path.split(basis)[0] 

正如我所说的工作,但我不记得为什么我认为这是必要的,而不是只使用sys.argv[0]

手中的工作只需使用basis就足够了(读取该目录中的文件)。 对于一个更加永久的logging来说,就像os.path.realpath(basis)一样分割。

更新实际上做了一个testing; 节奏猜测和扶手椅pontification 🙂

总结:忽略sys.frozen,忽略sys.executable,无条件地使用sys.argv [0]。

证据:

=== foo.py ===

 # coding: ascii import sys, os.path print 'sys has frozen:', hasattr(sys, 'frozen') print 'using sys.executable:', repr(os.path.dirname(os.path.realpath(sys.executable))) print 'using sys.argv[0]:', repr(os.path.dirname(os.path.realpath(sys.argv[0] ))) 

=== setup.py ===

 from distutils.core import setup import py2exe setup(console=['foo.py']) 

===结果===

 C:\junk\so\py2exe>\python26\python foo.py sys has frozen: False using sys.executable: 'C:\\python26' using sys.argv[0]: 'C:\\junk\\so\\py2exe' # where foo.py lives C:\junk\so\py2exe>dist\foo sys has frozen: True using sys.executable: 'C:\\junk\\so\\py2exe\\dist' using sys.argv[0]: 'C:\\junk\\so\\py2exe\\dist' # where foo.exe lives 

Py2exe没有定义__file__ : http ://www.py2exe.org/index.cgi/Py2exeEnvironment

OP请求一个py2exe友好的版本:

 SCRIPT_ROOT = os.path.dirname(os.path.realpath(__file__)) 

最好的答案是确定如果python被冻结在一个exe中,py2exe有这方面的文档: http : //www.py2exe.org/index.cgi/HowToDetermineIfRunningFromExe

 import imp, os, sys def main_is_frozen(): return (hasattr(sys, "frozen") or # new py2exe hasattr(sys, "importers") # old py2exe or imp.is_frozen("__main__")) # tools/freeze def get_main_dir(): if main_is_frozen(): return os.path.dirname(sys.executable) return os.path.dirname(os.path.realpath(__file__)) SCRIPT_ROOT = get_main_dir() 

因为,python是EAFP ,这里是一个EAFP版本…

 try: if sys.frozen or sys.importers: SCRIPT_ROOT = os.path.dirname(sys.executable) except AttributeError: SCRIPT_ROOT = os.path.dirname(os.path.realpath(__file__)) 

干杯!

尝试这个:

 import os import sys os.path.realpath(os.path.dirname(sys.argv[0]))