打开另一个python文件期间的Namerror

时间:2018-03-20 11:15:57

标签: python python-2.7

我一直在尝试从我的主python文件中打开一个python文件:

from banner import * 
from hexed import *  # this one is the file I am trying to open

我试图通过将文件视为模块来打开文件 这就是我如何称呼他们我的横幅文件完美无缺,但不能对hexed文件说同样的内容:

def options(self):
while True:
    try:
        try:
            main=raw_input(bcolors.B + "PYDRAGON> " + bcolors.E)
            if main == "msf":
            elif main == "crypto":
                hexed() #THIS IS WHERE I AM CALLING ANOTHER FILE
            elif main == "print":
                banner() #THIS ONE WORKS FINE
            else:
                print bcolors.R + "--> check your input <--" + bcolors.E
                time.sleep(1)
        except KeyboardInterrupt:
            print (bcolors.R + bcolors.U  + "\033[1m" + "\nCtrl-C Pressed! Use 'exit' to close the tool!" + bcolors.E)
            time.sleep(0.9)
            sys.exit()
            pass
    except EOFError:
        print (bcolors.R + bcolors.U + "\nUser Requsted An Interrupt ..Exixting.." + bcolors.E)
        time.sleep(0.9)
        sys.exit()
        pass

我的横幅功能完美无缺,但每当我尝试调用我的hexed python文件时,它都会给我这个错误

Traceback (most recent call last):
File "pydragon.py", line 149, in <module>
obj.options()
File "pydragon.py", line 115, in options
hexed()
NameError: global name 'hexed' is not defined

我检查了所有空格和标签,我认为没有任何缩进错误

下面的

是我的hexed文件的代码

def witch(self):
main = raw_input(bcolors.R + "Crytography> " + bcolors.E)

if main == 1:
    hound = raw_input(R +  bcolors.U + 'String to encode>' + bcolors.E)
    hound = hound.encode('hex','strict');
    print ""+ G +"Encoded: " + hound
elif main == 2:
    hound1 = raw_input(R +  bcolors.U + 'String to decode>' + bcolors.E)
    hound1 = hound.decode('hex','strict');
    print ""+ G +"Decoded String: " + hound1

else:
    print '\033[31m' + bcolors.BL + "GRRRR, what your'e trying to type ?? " + bcolors.E

我希望这些信息有所帮助 谢谢

2 个答案:

答案 0 :(得分:1)

函数名称为witch(),而不是hexed()。所以:

改变这个:

        elif main == "crypto":
            hexed() #THIS IS WHERE I AM CALLING ANOTHER FILE

对此:

        elif main == "crypto":
            witch() #THIS IS WHERE I AM CALLING ANOTHER FILE

答案 1 :(得分:1)

我不确定你真正想做什么,但你应该重新阅读有关进口的文件。

wrt /你当前的问题 - 在做的时候:

from somemodule import *

Python在sys.path中查找“somemodule.py”,将文件作为模块加载,从模块中收集所有顶级公共名称(“顶级”:在模块级别定义,“ public“:在模块的__all__属性中公开,或者 - 如果未定义__all__ - 不以下划线开头),并将它们绑定在当前命名空间中(最终重新绑定已定义的名称)。

所以在这两行之后:

from banner import * 
from hexed import *

您已在脚本的全局命名空间中注入banner.pyhexed.py中定义的所有名称。你显然在某个地方定义了一个名为banner()的函数,并且这个函数被调用,不是“hexed.py文件” - 你没有“调用文件”,这没有感觉,你可以调用一个函数,你可以调用一个类,但你不能“调用一个文件”(也不能“调用模块”FWIW,模块不可调用)。显然,在你的“hexed.py”模块中没有名为“hexed”的函数,因此NameError

解决方案很明确:通过显式导入替换您的星级导入(因为它们是维护噩梦应该避免),导入模块并通过它的限定名称调用您的函数,即:

# imports the whole "banner" module
import banner
# the first "banner" is the module name, the second is the function
banner.banner()

或仅导入您要使用的功能并直接调用它:

# imports the "banner" function from the "banner" module
from banner import banner
# calls the banner function
banner()

哦,当我们在它时:NameError在“你的模块打开期间,但是当你尝试使用一个名字(这里hexed)时没有发生settings->search 'hardware acceleration'在这一点上定义。