使用 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 包并查找更多导入错误,我会执行以下操作:

  1. 通过 运行ning __main__.py 测试 PyCharm 中的代码。
  2. 如果可行,我会构建 conda 包。
  3. 安装 conda 包。
  4. 在命令中 window 我会 运行 python "C:\Miniconda2\envs\myenv\Scripts\MyApp-script.pyw"。这会给我下一个 PyCharm 没有的错误。

我会 return 源代码,进行必要的更改并重复步骤 1-4 直到程序从桌面图标启动。