我怎么能得到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.executable
和sys.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]))