如何在Python中获取_umain__;模块的文件名?

如何在Python中获取_umain__;模块的文件名?,python,python-module,Python,Python Module,假设我有两个模块: a、 py: b、 py: 我运行“a.py”文件。这张照片是: b C:\path\to\code\b.py __main__ C:\path\to\code\a.py 问题:如何从“b.py”库中获取\uuuu main\uuuu模块的路径(在本例中为“a.py”)?也许这样做可以: import sys from os import path print path.abspath(sys.modules['__main__'].__file__) 请注

假设我有两个模块:

a、 py:

b、 py:

我运行“a.py”文件。这张照片是:

b        C:\path\to\code\b.py
__main__ C:\path\to\code\a.py

问题:如何从“b.py”库中获取
\uuuu main\uuuu
模块的路径(在本例中为“a.py”)?

也许这样做可以:

import sys
from os import path
print path.abspath(sys.modules['__main__'].__file__)
请注意,为了安全起见,您应该检查
\uuuuu main\uuuuuu
模块是否具有
\uuuu file\uuuuu
属性。如果它是动态创建的,或者只是在交互式python控制台中运行,那么它将不会有
\uuu文件\uu

python
>>> import sys
>>> print sys.modules['__main__']
<module '__main__' (built-in)>
>>> print sys.modules['__main__'].__file__
AttributeError: 'module' object has no attribute '__file__'
python
>>>导入系统
>>>打印系统模块[''.'主'.']
>>>打印系统模块[''主文件].\u__
AttributeError:“模块”对象没有属性“\u_文件”

如果您的应用程序中有可能出现这种情况,那么一个简单的hasattr()检查就可以防止出现场景2。

下面的python代码提供了额外的功能,包括与可执行文件无缝协作

import __main__
print __main__.__file__
我使用类似的代码来查找与正在运行的脚本(aka
\uuuuu main\uuuu
)相关的路径。另外一个好处是,它可以跨平台工作,包括Windows

import imp
import os
import 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():
       # print 'Running from path', os.path.dirname(sys.executable)
       return os.path.dirname(sys.executable)
   return os.path.dirname(sys.argv[0])

# find path to where we are running
path_to_script=get_main_dir()

# OPTIONAL:
# add the sibling 'lib' dir to our module search path
lib_path = os.path.join(get_main_dir(), os.path.pardir, 'lib')
sys.path.insert(0, lib_path)

# OPTIONAL: 
# use info to find relative data files in 'data' subdir
datafile1 = os.path.join(get_main_dir(), 'data', 'file1')
希望上面的示例代码能够提供关于如何确定运行脚本的路径的更多见解

import sys, os

def getExecPath():
    try:
        sFile = os.path.abspath(sys.modules['__main__'].__file__)
    except:
        sFile = sys.executable
    return os.path.dirname(sFile)

此函数适用于Python和Cython编译的程序。

另一种方法是使用
sys.argv[0]

import os
import sys

main_file = os.path.realpath(sys.argv[0]) if sys.argv[0] else None

如果Python以
-c
开头,或者从Python控制台选中,则
sys.argv[0]
将是空字符串。

Wunderbar!我很高兴能帮上忙。如果这确实回答了您的问题,您介意点击问题上的“接受”按钮吗?:-)我恢复了更改。。。平心而论,ironfroggy给出了最适合你的答案,我真的认为他应该得到唯一的赞扬。假设主脚本没有
\uuuu文件属性?那你怎么走这条路呢?你说要检查main是否有
\uuuuuu文件\uuuuuuu
属性,但是你的代码没有显示如果main没有属性该怎么办。太好了!重要的是要意识到需要导入main-我做了一个随机猜测,实际上尝试了第二行,但失败了-现在我知道了原因。
\uuuuuu main\uuuuu
并不总是具有
\uuuuuu file\uuuuuuuu
属性。+1因为下面帖子的评论中有romkyns请求。@J.F.Sebastian我们能可靠地使用
inspect.getfile(\uuuu main\uu)
要获取文件路径吗?@jpmc26:我不知道。要获取脚本的目录(不是它的名称),可以使用如果在启动脚本和调用
os.dirname(sys.argv[0])之间更改目录(使用
os.chdir
),则结果毫无意义。我使用创建一个
GLOBALS.py
模块,该模块至少由主脚本导入,它执行类似于上述代码的内容,并将结果存储在变量
MAINDIR
中,这样我就可以从任何其他模块访问
GLOBALS.MAINDIR
,而不用担心使用
os.chdir
。如果您想知道脚本的起始目录,并且还想使用
os.chdir()
,您需要保存初始的
os.getcwd()
。由于用户在windows上,我想演示一些仍然可以在py2exe和freeze上下文中工作的东西。如果Python使用
-c
选项启动,或者从Python控制台选中了
sys.argv[0]
,您如何获取
\uu主\uuuuu
模块的路径?
import sys, os

def getExecPath():
    try:
        sFile = os.path.abspath(sys.modules['__main__'].__file__)
    except:
        sFile = sys.executable
    return os.path.dirname(sFile)
import os
import sys

main_file = os.path.realpath(sys.argv[0]) if sys.argv[0] else None