为什么没有函数导入python模块?

时间:2016-03-19 01:35:56

标签: python

我为gui应用程序和转轮脚本setup.py创建了一个myapp脚本。 跑步者脚本包含:

#!/usr/bin/env python3

import myapp
myapp.gui_mode()

可以使用python3 myapp.py从命令行运行该应用程序 以下是myapp.py的样子:

#!/usr/bin/evn python3

def gui_mode():
    run_app()

def main():
    print("Starting UI")
    gui_mode()

if __name__ == '__main__':
    main()

使用sudo python3 setup.py install安装应用程序并尝试使用myapp从控制台运行该应用程序后,收到以下消息: AttributeError: module 'myapp' has no attribute 'gui_mode'

好的,我启动python3翻译并检查:

import myapp
print(dir(myapp))
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__']

我想知道,为什么myapp在没有自己的功能的情况下导入?

更新

In [4]: print(myapp.__file__)
/home/tastyminerals/dev/NEFI2/nefi2/__init__.py

这是项目结构:

APP2/
    setup.py
        myapp/myapp.py
        myapp/bin/run_myapp  <-- renamed runner file
        myapp/__init__.py
        myapp/data

setup.py的关键部分:

    packages=['myapp'],

    scripts=[
        'myapp/bin/run_myapp'
    ],

2 个答案:

答案 0 :(得分:1)

跑步者脚本名为myapp,其所依赖的模块也称为myapp。你有没有为包myapp命名?与setup.py一起安装的东西有一个基本包名称,所以我猜你也可能将包命名为myapp,所以你实际上需要导入myapp.myapp(或者将包中的myapp.py重命名为__init__.py,以便该包的行为类似于同名模块。)

在任何情况下重叠这样的名字都是个坏主意;如果转轮脚本本身名为myapp.py,那么它将优先导入自己的myapp包; Python首先搜索本地目录,这就是为什么命名与Python内置模块重叠的脚本名称的好主意(例如,永远不要命名脚本math.py,否则你可能会搞砸import math同一目录中其他脚本的语句。)

答案 1 :(得分:1)

如果您导入此处显示的myapp.py,则会有gui_modemain属性。我怀疑您没有加载您尝试加载的myapp.py模块。检查myapp.__file__的值以查看您实际加载的文件。