2010-02-18 22 views
15

我用这段代码在我的脚本查明,在跨平台的方式,正是在那里它被从运行:我怎样才能得到py2exe中的可执行文件的当前目录?

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

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

+0

有一个较老的重复问题,但用较少的答案:[确定pyInstaller生成的Python EXE中的应用程序路径](http://stackoverflow.com/questions/404744) – olibre 2013-11-12 15:03:20

回答

2

试试这个:

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

根据我的经验,使用'sys.argv [ 0]'当通过PATH变量找到程序时没有路径。 – Ber 2013-07-18 13:03:36

+0

@Ber,但是,'py2exe'是一种特殊情况,并且在所有情况下都将其设置为完全限定值。 – 2015-05-26 19:32:03

20

这里是py2exe documentation reference和这里的相关项目:

  • sys.executable设置为EXE文件的完整路径。
  • sys.argv中的第一项是可执行文件的完整路径名,其余部分是命令行参数。
  • 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就足以完成手头的工作(读取该目录中的文件)。为了获得更长久的记录,请将其分割为如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 
+0

我相信,sys.executable通常指向python解释器本身,这是你想在py2exe下,但不是其他。 – prestomation 2010-02-19 03:19:02

+0

@prestomation:在py2exe的情况下,什么是“Python解释器本身”?你的意思是“但不是其他”? – 2010-02-19 04:12:40

+0

“否则”是当你运行一个解释文件,这是最环境。在py2exe的情况下,我会想象解释器是你的py2exe,因为它包含在内。它看起来像你最近的编辑确认。 – prestomation 2010-02-19 14:27:38

8

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() 

因为,蟒蛇是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__)) 

干杯!

+0

@你是对的......我应该仔细阅读。更好? – VertigoRay 2013-07-18 23:44:03

+1

这完全是问题的要求。感谢您的解决方案。 – 2015-04-05 15:30:13

相关问题