我为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'
],
答案 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_mode
和main
属性。我怀疑您没有加载您尝试加载的myapp.py
模块。检查myapp.__file__
的值以查看您实际加载的文件。