我用这段代码在我的脚本查明,在跨平台的方式,正是在那里它被从运行:我怎样才能得到py2exe中的可执行文件的当前目录?
SCRIPT_ROOT = os.path.dirname(os.path.realpath(__file__))
很简单。然后,我继续在我的脚本的其他区域使用SCRIPT_ROOT
,以确保一切正常。我的问题发生在我通过py2exe运行时,因为生成的可执行文件没有设置__file__
,因此我的脚本中断了。有谁知道如何解决或解决此问题?
我用这段代码在我的脚本查明,在跨平台的方式,正是在那里它被从运行:我怎样才能得到py2exe中的可执行文件的当前目录?
SCRIPT_ROOT = os.path.dirname(os.path.realpath(__file__))
很简单。然后,我继续在我的脚本的其他区域使用SCRIPT_ROOT
,以确保一切正常。我的问题发生在我通过py2exe运行时,因为生成的可执行文件没有设置__file__
,因此我的脚本中断了。有谁知道如何解决或解决此问题?
试试这个:
import os
import sys
os.path.realpath(os.path.dirname(sys.argv[0]))
根据我的经验,使用'sys.argv [ 0]'当通过PATH变量找到程序时没有路径。 – Ber 2013-07-18 13:03:36
@Ber,但是,'py2exe'是一种特殊情况,并且在所有情况下都将其设置为完全限定值。 – 2015-05-26 19:32:03
这里是py2exe documentation reference和这里的相关项目:
sys.executable
设置为EXE文件的完整路径。sys.argv
中的第一项是可执行文件的完整路径名,其余部分是命令行参数。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
就足以完成手头的工作(读取该目录中的文件)。为了获得更长久的记录,请将其分割为如os.path.realpath(basis)
。
更新其实做了一个测试; beats猜测和扶手椅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] )))
===设置。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
我相信,sys.executable通常指向python解释器本身,这是你想在py2exe下,但不是其他。 – prestomation 2010-02-19 03:19:02
@prestomation:在py2exe的情况下,什么是“Python解释器本身”?你的意思是“但不是其他”? – 2010-02-19 04:12:40
“否则”是当你运行一个解释文件,这是最环境。在py2exe的情况下,我会想象解释器是你的py2exe,因为它包含在内。它看起来像你最近的编辑确认。 – prestomation 2010-02-19 14:27:38
Py2exe没有定义__file__
:http://www.py2exe.org/index.cgi/Py2exeEnvironment
的OP请求的py2exe友好版本:
SCRIPT_ROOT = os.path.dirname(os.path.realpath(__file__))
最好的答案是确定python是否被冻结在一个exe文件中,py2exe有文件entation在此: 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()
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__))
干杯!
@你是对的......我应该仔细阅读。更好? – VertigoRay 2013-07-18 23:44:03
这完全是问题的要求。感谢您的解决方案。 – 2015-04-05 15:30:13
有一个较老的重复问题,但用较少的答案:[确定pyInstaller生成的Python EXE中的应用程序路径](http://stackoverflow.com/questions/404744) – olibre 2013-11-12 15:03:20