使用 Python setuptools 制作的应用程序安装但不会从桌面快捷方式启动
App made with Python setuptools installs but won't launch from Desktop shortcut
我有一个 GUI 应用程序,这是另一位开发人员写的,我正试图将其转换为一个 conda 程序包,它将在桌面上安装一个桌面图标,用户可以随后无缝启动。
下面是文件夹结构和我可以分享的代码:
Documents/
└── project/
├── bld.bat
├── meta.yaml
├── setup.py
├── setup.cfg
└── mygui/
├── MainGUI.py
├── __init__.py
├── __main__.py
└── images/
└── icon.ico
Documents\project\bld.bat:
python setup.py install install_shortcuts
if errorlevel 1 exit 1
Documents\project\meta.yaml:
package:
name: mygui
version: 1.2.3
source:
path: ./
build:
number: 1
string: py{{ CONDA_PY }}_{{ ARCH }}
requirements:
build:
- python 2.7.13
- pyvisa 1.4
- setuptools
- setuptools-shortcut
- pydaqmx
- pmw
- matplotlib
- pyserial
- pil
run:
- python 2.7.13
- pyvisa 1.4
- pydaqmx
- pmw
- matplotlib
- pyserial
- pil
about:
license:
summary: My GUI application
Documents\project\setup.py:
from setuptools import setup, find_packages
setup(
name='mygui',
version='1.2.3',
author='Me',
author_email='me@myemail.com',
description=(
"An App I wrote."
),
long_description="Actually, someone else wrote it but I'm making the conda package.",
packages=find_packages(),
package_data={
'mygui': ['images/*ico'],
},
entry_points={
'gui_scripts': [
'MyApp = mygui.__main__:main'
],
},
install_requires=['pyvisa==1.4', 'pmw', 'pydaqmx', 'matplotlib', 'pyserial', 'pil']
)
Documents\project\setup.cfg:
[install]
single-version-externally-managed=1
record=out.txt
[install_shortcuts]
iconfile=mygui/images/icon.ico
name=MyApp
group=My Custom Apps
desktop=1
Documents\project\mygui__main__.py:
from MainGUI import main
if __name__ == '__main__':
main()
最初的 GUI 开发人员在块中有一个代码块,如下所示:
if __name__ == '__main__':
<code here>
所以我把所有的代码都放到了 cut/paste 中:
def main():
<code here>
if __name__ == '__main__':
main()
全部在 MainGUI.py 文件中。我无法分享代码的细节。但它的工作原理如下所述。
当我在 PyCharm 中打开我的代码并点击 运行 或在 conda 环境中调试时,所有包都列在 meta.yaml 文件中,应用程序工作正常,没有警告或错误。但是,当我 运行 conda build
,上传到 anaconda 频道,然后在机器上安装时,桌面图标已创建,但当我单击它时应用程序不会 运行。
我的设置文件有问题吗?如何调试应用程序失败的原因?我没有看到任何命令 window 或任何类型的输出,并且 PyCharm 没有抱怨,所以它一定是在应用程序完成后发生的事情。
更新: 这是我第一次创建一个 conda 包,它像这样将自己安装为应用程序,我使用同事的 setup.py 文件作为模板。我很好奇他在他的一个项目中创建的 conda 包在结构上是否与我的 conda-build 中的 conda 包不同,事实确实如此。如果我拿那个 tar.bz 文件并解压缩,这就是我得到的结构:
mygui-1.2.3-py27_32/
├── info/
├── about.json
├── files
├── has_prefix
├── index.json
└── paths.json
├── Lib/
└── site-packages
└── mygui-1.2.3-py2.7.egg-info
├── dependency_links.txt
├── entry_points.txt
├── PKG-INFO
├── requires.txt
├── SOURCES.txt
└── top_level.txt
├── Menu/
├── mygui.ico
└── mygui_menu.json
└── Scripts/
├── MyApp.exe
├── MyApp.manifest
└── MyApp.pyw
但我的同事得到了相同的结构,但他也得到了一个名为 Lib/site-packages/mygui/
的目录,例如,其中包含 .py 和 .pyc 文件和目录中的源代码。为什么我的包没有获得这些源文件,这可能是我的应用程序无法启动的原因吗?我也没有看到我在 setup.py 文件(*.ico 文件)
中指出的任何数据文件
我终于能够制作这个应用程序,它会在桌面上安装快捷方式并包含源代码。
问题出在导入上。由于原始源代码是几年前编写的,所以他们没有 absolute_imports.
我必须通过并确保
from __future__ import (
unicode_literals,
print_function,
division,
absolute_import
)
位于每个进行导入的文件的顶部,然后还将相对导入更改为绝对导入。但是,在根 __init__.py
文件中,我保留了相对导入。哦,我做错的另一件事是,在我的 setup.py
的一个版本中,我包含了这四个导入。不要那样做,否则 python 会抱怨 unicode_literals。我只是把它从 setup.py 中遗漏了,没关系。
要调试 conda 包并查找更多导入错误,我会执行以下操作:
- 通过 运行ning
__main__.py
测试 PyCharm 中的代码。
- 如果可行,我会构建 conda 包。
- 安装 conda 包。
- 在命令中 window 我会 运行
python "C:\Miniconda2\envs\myenv\Scripts\MyApp-script.pyw"
。这会给我下一个 PyCharm 没有的错误。
我会 return 源代码,进行必要的更改并重复步骤 1-4 直到程序从桌面图标启动。
我有一个 GUI 应用程序,这是另一位开发人员写的,我正试图将其转换为一个 conda 程序包,它将在桌面上安装一个桌面图标,用户可以随后无缝启动。
下面是文件夹结构和我可以分享的代码:
Documents/
└── project/
├── bld.bat
├── meta.yaml
├── setup.py
├── setup.cfg
└── mygui/
├── MainGUI.py
├── __init__.py
├── __main__.py
└── images/
└── icon.ico
Documents\project\bld.bat:
python setup.py install install_shortcuts
if errorlevel 1 exit 1
Documents\project\meta.yaml:
package:
name: mygui
version: 1.2.3
source:
path: ./
build:
number: 1
string: py{{ CONDA_PY }}_{{ ARCH }}
requirements:
build:
- python 2.7.13
- pyvisa 1.4
- setuptools
- setuptools-shortcut
- pydaqmx
- pmw
- matplotlib
- pyserial
- pil
run:
- python 2.7.13
- pyvisa 1.4
- pydaqmx
- pmw
- matplotlib
- pyserial
- pil
about:
license:
summary: My GUI application
Documents\project\setup.py:
from setuptools import setup, find_packages
setup(
name='mygui',
version='1.2.3',
author='Me',
author_email='me@myemail.com',
description=(
"An App I wrote."
),
long_description="Actually, someone else wrote it but I'm making the conda package.",
packages=find_packages(),
package_data={
'mygui': ['images/*ico'],
},
entry_points={
'gui_scripts': [
'MyApp = mygui.__main__:main'
],
},
install_requires=['pyvisa==1.4', 'pmw', 'pydaqmx', 'matplotlib', 'pyserial', 'pil']
)
Documents\project\setup.cfg:
[install]
single-version-externally-managed=1
record=out.txt
[install_shortcuts]
iconfile=mygui/images/icon.ico
name=MyApp
group=My Custom Apps
desktop=1
Documents\project\mygui__main__.py:
from MainGUI import main
if __name__ == '__main__':
main()
最初的 GUI 开发人员在块中有一个代码块,如下所示:
if __name__ == '__main__':
<code here>
所以我把所有的代码都放到了 cut/paste 中:
def main():
<code here>
if __name__ == '__main__':
main()
全部在 MainGUI.py 文件中。我无法分享代码的细节。但它的工作原理如下所述。
当我在 PyCharm 中打开我的代码并点击 运行 或在 conda 环境中调试时,所有包都列在 meta.yaml 文件中,应用程序工作正常,没有警告或错误。但是,当我 运行 conda build
,上传到 anaconda 频道,然后在机器上安装时,桌面图标已创建,但当我单击它时应用程序不会 运行。
我的设置文件有问题吗?如何调试应用程序失败的原因?我没有看到任何命令 window 或任何类型的输出,并且 PyCharm 没有抱怨,所以它一定是在应用程序完成后发生的事情。
更新: 这是我第一次创建一个 conda 包,它像这样将自己安装为应用程序,我使用同事的 setup.py 文件作为模板。我很好奇他在他的一个项目中创建的 conda 包在结构上是否与我的 conda-build 中的 conda 包不同,事实确实如此。如果我拿那个 tar.bz 文件并解压缩,这就是我得到的结构:
mygui-1.2.3-py27_32/
├── info/
├── about.json
├── files
├── has_prefix
├── index.json
└── paths.json
├── Lib/
└── site-packages
└── mygui-1.2.3-py2.7.egg-info
├── dependency_links.txt
├── entry_points.txt
├── PKG-INFO
├── requires.txt
├── SOURCES.txt
└── top_level.txt
├── Menu/
├── mygui.ico
└── mygui_menu.json
└── Scripts/
├── MyApp.exe
├── MyApp.manifest
└── MyApp.pyw
但我的同事得到了相同的结构,但他也得到了一个名为 Lib/site-packages/mygui/
的目录,例如,其中包含 .py 和 .pyc 文件和目录中的源代码。为什么我的包没有获得这些源文件,这可能是我的应用程序无法启动的原因吗?我也没有看到我在 setup.py 文件(*.ico 文件)
我终于能够制作这个应用程序,它会在桌面上安装快捷方式并包含源代码。
问题出在导入上。由于原始源代码是几年前编写的,所以他们没有 absolute_imports.
我必须通过并确保
from __future__ import (
unicode_literals,
print_function,
division,
absolute_import
)
位于每个进行导入的文件的顶部,然后还将相对导入更改为绝对导入。但是,在根 __init__.py
文件中,我保留了相对导入。哦,我做错的另一件事是,在我的 setup.py
的一个版本中,我包含了这四个导入。不要那样做,否则 python 会抱怨 unicode_literals。我只是把它从 setup.py 中遗漏了,没关系。
要调试 conda 包并查找更多导入错误,我会执行以下操作:
- 通过 运行ning
__main__.py
测试 PyCharm 中的代码。 - 如果可行,我会构建 conda 包。
- 安装 conda 包。
- 在命令中 window 我会 运行
python "C:\Miniconda2\envs\myenv\Scripts\MyApp-script.pyw"
。这会给我下一个 PyCharm 没有的错误。
我会 return 源代码,进行必要的更改并重复步骤 1-4 直到程序从桌面图标启动。