GaR*_*Ryu 4 python programming quickly crossplatform application-development
对不起,文字墙,但我试图为我的问题提供一个很好的背景。实际上,这里有大约一百万个问题,因为我完全糊涂了。我最近学习了一些 Python 编程并制作了一个 Windows 应用程序。现在我想为 Ubuntu 实现该应用程序和其他一些想法,并将它们作为开源 GPL-3 发布。虽然,我想让代码可以在任何系统(或至少 Ubuntu 和 Windows)上运行。
因此,为了了解 Ubuntu 打包的工作原理,我查看了最近在 App Developer Showdown 中使用的快速应用程序。但是文件夹结构和它创建的文件对我来说毫无意义。所以我阅读了Ubuntu Packaging Guide和Applicton Review Process以及那里的所有链接,以及Debian Python Policy。但所有这些文字都让我对快速创建文件和文件夹的方式更加困惑。
所以,这就是我从快速理解的(假设我的项目名称是 proj):
proj/bin
= 将复制到 /usr/share/bin/proj.py 以启用从全局路径运行应用程序的单个文件?但这会违反“申请审查流程”规则,对吗?
proj/data/*
= 应该放在 /usr/share/proj/* 下的文件,对吗?但这也会违反“申请审查程序”规则吗?
proj/help/C/*
= 我认为一些 HTML 文档应该放在 /usr/share/doc/proj/ 下,并且与“申请审查流程”配合得很好,但是为什么文件夹名称是“C”而不仅仅是“proj”?
proj/tests/
= Python 中“测试”包的某种文件。我想这很棒,期待了解它是什么。
proj/proj/
= 一些文件似乎只是链接到 proj_lib 文件夹中的新文件?似乎没有必要,我不
proj/proj_lib/
= 实际的源代码,我猜?
然后很快还创建proj/apport
和proj/etc/apport*
我不知道他们做了什么或者他们为什么要加入。
现在,真正令人困惑的部分是文件结构。它看起来像我以前见过的任何东西。老实说,它以一种不必要的方式看起来非常复杂。在本节下面,我将描述我制作自己的项目文件结构的方式,这可能有助于说明为什么这让我如此困惑。但首先,我对快速方式的理解(请注意,此时我的理解可能是错误的)。
首先,该 setup.py
. 该文件包含一个名为 update_config() 的函数,它只加载另一个名为 proj/proj_lib/projconfig.py 的文件。但是那个 config.py 文件似乎没有包含任何有助于与 setup.py 分开的东西?实际上,有很多东西我以前从未见过有人建议将其放入 setup.py 文件中。setup.py 还包含一个指向 SVG 图标的硬编码文件名,否则只是将 desktop.in-file 复制到自身上,那么为什么不直接在 desktop.in-file 中进行更改而没有设置中的此功能.py?然后还有另一个功能来创建一个子目录 proj/data/share/proj 并将desktop.in-file复制到那里,我不明白这是什么目的?当您最初可以将文件放在那里时,为什么要使用一个函数来执行此操作?然后 毕竟这些荒谬的代码实际上看起来像一个常规的 setup.py。
现在proj/bin/proj.py
,我认为应该用于启动应用程序?这似乎只是在以前未声明的 syspath 变量中将 /usr/ 重新映射到 /opt/extras.ubuntu.com/ 。所以我想这是为了适应使用所有其他 Linux 风格的文件夹名称标准的应用程序的“应用程序审查流程”中的规则?公平地说,我不明白,但我可以忍受。在重新映射目录之后,该文件继续调用 proj/proj/ init .py。
proj/proj/__init__.py
是定义如何启动模块的标准方法,我猜?但是,该文件没有实际执行某些操作的代码,而是继续依次运行位于另一个文件中的主窗口类。
proj/proj_lib/
还有一个init .py 文件,我不明白它的用途。然后是一个 Window.py,它似乎包含应用程序的实际功能,并调用其他窗口 py 文件,如关于对话框等。
我的文件夹结构如下所示:
proj/
proj/ui
proj/imageformats # necessary for imports to work
proj/sqldrivers # necessary for imports to work
Run Code Online (Sandbox Code Playgroud)
在proj/
文件夹中我有我的 setup.py 和我的 proj.py 启动我的应用程序。在我的 proj.py 文件中,我拥有所有的主窗口功能,通过导入调用其他一些窗口和函数,在这个文件的末尾是启动应用程序的main () 函数。
该proj/ui/
文件夹包含我使用 Qt Designer 制作的所有 .ui 文件。
其他文件夹只是为了提供一些文件,当与 Windows 的 py2exe 打包时,这些文件将使应用程序工作。基本上,它们是通过 Ubuntu 中的依赖项提供的文件。
请注意,我的这个设置非常适合 Windows 开发。我使用 py2exe 来构建一个最终在一个proj/dist/
文件夹中的可执行文件,我可以只复制这个文件夹中的文件,它可以在任何 Windows 机器上运行。
我花了几天时间试图阅读文档。除了基本教程和 App Developer Showdown Workshops 上的内容外,我几乎找不到任何东西可以快速找到。我在那里找不到任何可以帮助我理解快速建议的文件夹结构的内容。
从我读过的内容来看,我可以用来os.environ['HOME']
在 Ubuntu 上创建 ~/.config/proj.conf 或 Windows 上的 C:/Users/username/.config/proj.conf 的路径。到目前为止,我可以保持跨平台代码。但是随着划分为 /bin 和 /etc 和 /opt 我将开始遇到一些问题。当然,作为最后的手段,我可以保留两份代码副本——一份为 Ubuntu 设置,另一份为 Windows 设置。但是我仍然想要一个类似的文件夹结构来使代码更改的传输变得容易。
应该有人已经对此有了很好的解决方案。也许那个人还可以(除了给出一个如何使它跨平台的例子)描述为什么有这么长的文件链调用其他文件在默认快速设置中调用其他文件?当然,我现在假设快速使用某种推荐的 Ubuntu 模型。如果情况并非如此,我想获得有关通过 Ubuntu 存储库分发应用程序的推荐文件夹结构的建议?
在特定于 Ubuntu 或特定于 Debian 的页面之外进行了大量谷歌搜索之后,我发现这个实际上相当有帮助。基本上,建议是保持它像这样:
proj/
proj/bin/proj.py # this will just "import proj" and "main()"
proj/proj/__init__.py # this will just "import window.py" and run that
proj/proj/window.py # main functionality
proj/proj/submodule/__init__.py # import in window.py
proj/proj/test/ # for that test package that quickly also uses
proj/README # basic readme file
proj/setup.py # standard distutils setup.py
Run Code Online (Sandbox Code Playgroud)
这听起来比快速方式更明智,更接近我原来的做法。把它做成一个遵循 Ubuntu 指南的 Debian 包应该不是不可能的?所以我想我会删除快速的东西并执行此操作。除非有人有更好的建议?
那么这里剩下的是“我如何设置它以在 Ubuntu 和 Windows 上安装得很好?”,即我应该以特殊方式编码 setup.py 还是在代码中进行其他考虑...