在构建我的项目时,我有点迷茫。我尝试以有意义的方式组织事物,但总是每天至少重组整个事物两次。诚然,我的项目不是很大,但我希望不必重组所有内容而只解决一次。
我将描述我当前的程序以尝试理解事物。这是一个带有数据库后端的图形程序,用于计算帆的价格。尚未编写所有内容,但用户将能够从两个下拉菜单中选择风帆类别和型号。根据类别-模型组合,程序将显示复选框和旋转框。这些复选框和旋转框在更改时会从数据库中提取信息,并显示选中该复选框或在旋转框中具有特定数字(例如,以平方米为单位的面积)的价格。
在当前形式下,项目如下所示:
COPYING
README.md
SailQt.pyw (Should program be called from here ...)
sailqt/
__init__.py (This holds a __version__ string)
SailQt.pyw (... or here?)
gui/
__init__.py
MainWindow.py (This needs access to a __version__ string)
MainWindow_rc.py
OptionsWidget.py
ui_MainWindow.py
ui_OptionsWidget.py
resources/
__init__.py
database.db
generate_gui.py
MainWindow.ui
MainWindow.qrc
OptionsWidget.ui
icons/
logo.png
进一步澄清。 resources 包含在 Qt Designer 中制作的所有 .ui 文件。它们是描述 GUI 的 XML 文件。可以使用终端工具将它们转换为 Python 脚本,我已将其嵌入到 generate_gui.py 中。 .qrc 文件也是如此。 generate_gui.py 将自动生成的文件放在 gui 文件夹中,前缀为 ui_ 或后缀为 _rc。 database.db 目前为空,但最终将用于保存价格和所有内容。
MainWindow.py 和 OptionsWidget.py 是保存同名对象的 Python 文件,但不包含 .py 后缀。 MainWindow 在其显示表面中保存 OptionsWidget。两个对象都使用它们对应的 ui 和 rc 文件。
SailQt.pyw 是创建 MainWindow 实例的文件,告诉它显示自己,然后告诉 (Py)Qt 进入它的循环并从那里。它基本上很像许多图形应用程序的 .exe 文件,因为它是一个让程序运行的小文件。
我最初的猜测是将 SailQt.pyw 放在 sailqt 文件夹中。但随后 MainWindow.py 突然需要访问 __version__ 字符串。我能弄清楚如何实现的唯一方法是将 SailQt.pyw 移动到我项目的根文件夹,并让 MainWindow.py 导入 sailqt .__版本__。但考虑到那是我第 n 次不得不在大多数文件中重新调整内容并重做行以解决这个微小的调整,所以我决定在这里问。
我的问题很清楚:
import os,然后做os.system("sudo rm -rf/")之类的东西,但是我不能做之类的东西导入sailqt 然后执行sailqt.gui.generate_gui.generate()?最佳答案
让我们首先处理您的最后一个问题,因为就构建 python 项目而言,它是最重要的。一旦你弄清楚了如何让导入在你的项目中正常工作,剩下的就变得更容易处理了。
要理解的关键是当前运行脚本的目录会自动添加到sys.path的start中。因此,如果您将您的 main.py 脚本(您当前正在调用的 SailQt.pyw)outside 放在包的顶层容器目录,它将保证包导入始终有效,无论脚本从哪里执行。
因此,最小的起始结构可能如下所示:
project/
main.py
package/
__init__.py
app.py
mainwindow.py
现在,因为 main.py 必须在顶级 python 包目录的 outside 中,它应该只包含最少的代码量(刚好足以获取程序启动)。鉴于上述结构,这意味着仅此而已:
if __name__ == '__main__':
import sys
from package import app
sys.exit(app.run())
app 模块将包含初始化程序和设置 gui 所需的大部分实际代码,这些代码将像这样导入:
from package.mainwindow import MainWindow
并且可以在包的任何地方使用相同形式的完全限定导入语句。因此,例如,使用这个稍微复杂一点的结构:
project/
main.py
package/
__init__.py
app.py
mainwindow.py
utils.py
dialogs/
search.py
search 模块可以像这样从 utils 模块导入函数:
from package.utils import myfunc
关于访问 __version__ 字符串的具体问题:对于 PyQt 程序,您可以将以下内容放在 app 模块的顶部:
QtGui.QApplication.setApplicationName('progname')
QtGui.QApplication.setApplicationVersion('0.1')
然后像这样访问名称/版本:
name = QtGui.qApp.applicationName()
version = QtGui.qApp.applicationVersion()
您当前结构的其他问题主要与维护代码文件和资源文件之间的分离有关。
首先:包树应该只包含代码文件(即 python 模块)。资源文件属于项目目录(即包外)。其次:包含从资源生成的代码的文件(例如,由 pyuic 或 pyrcc)可能应该放在单独的子包中(这也使您的版本控制工具可以轻松地排除它们)。这将导致一个像这样的整体项目结构:
project/
db/
database.db
designer/
mainwindow.ui
icons/
logo.png
LICENSE
Makefile
resources.qrc
main.py
package/
__init__.py
app.py
mainwindow.py
ui/
__init__.py
mainwindow_ui.py
resources_rc.py
这里,Makefile(或等效文件)负责生成 ui/rc 文件、编译 python 模块、安装/卸载程序等。程序运行时所需的资源(例如作为数据库文件),需要安装在您的程序知道如何找到的标准位置(例如 Linux 上的 /usr/share/progname/database.db 之类的位置)。在安装时,Makefile 还需要生成一个可执行的 bash 脚本(或等效的),该脚本知道您的程序在哪里以及如何启动它。也就是说,类似于:
#!/bin/sh
exec 'python' '/usr/share/progname/main.py' "$@"
这显然需要安装为 /usr/bin/progname (或其他)。
一开始这似乎需要处理很多事情,但当然,找到一个运行良好的项目结构的主要好处是,您可以在所有 future 的项目中重复使用它(并开始开发自己的用于设置和管理这些项目的模板和工具)。
关于python - 一般来说,(Python)项目是如何构建的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22177976/
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为