是否有一种标准方法可以将版本字符串与python包关联起来,以便我可以执行以下操作?
import foo
print foo.version
Run Code Online (Sandbox Code Playgroud)
我想有一些方法可以在没有任何额外硬编码的情况下检索数据,因为setup.py已经指定了次要/主要字符串.我找到的替代解决方案是import __version__在我的foo/__init__.py,然后__version__.py生成setup.py.
我正在开发一个python框架,它将"插件"写成单独的包.即:
import myframework
from myframework.addons import foo, bar
Run Code Online (Sandbox Code Playgroud)
现在,我正在尝试安排的是这些插件可以与核心框架分开分发并注入myframework.addons命名空间.
目前,我对此的最佳解决方案如下.将部署一个附加组件(最有可能{python_version}/site-packages/如此:
fooext/
fooext/__init__.py
fooext/myframework/
fooext/myframework/__init__.py
fooext/myframework/addons/
fooext/myframework/addons/__init__.py
fooext/myframework/addons/foo.py
Run Code Online (Sandbox Code Playgroud)
在fooext/myframework/addons/__init__.py将有pkgutil路径扩展代码:
import pkgutil
__path__ = pkgutil.extend_path(__path__, __name__)
Run Code Online (Sandbox Code Playgroud)
问题是,为了使这个工作,PYTHONPATH需要有fooext/它,但它唯一的东西是父安装目录(很可能是上面提到的site-packages).
这个问题的解决是有额外的代码,myframework/addons/__init__.py这将tranverse sys.path,寻找与myframework子包,在这种情况下将其添加到任何模块sys.path和一切正常.
我的另一个想法是直接编写addon文件来myframework/addons/安装位置,但是它会使开发和部署的命名空间不同.
是否有更好的方法来实现这一点,或者可能采用不同的方法解决上述分配问题?
我有一个带有表的Sqlite3数据库和一个由两个整数组成的主键,我正在尝试向其中插入大量数据(即大约1GB左右)
我遇到的问题是创建主键也隐式创建了一个索引,在我的情况下,在几次提交之后将插入陷入爬行(这可能是因为数据库文件在NFS上.. 叹息).
所以,我想以某种方式临时禁用该索引.到目前为止,我最好的计划是删除主键的自动索引,但似乎SQLite不喜欢它并且如果我尝试这样做会抛出错误.
我的第二个最佳计划将涉及应用程序在网络驱动器上制作透明的数据库副本,进行修改然后将其合并.请注意,与大多数SQlite/NFS问题相反,我不需要访问并发.
做这样的事情的正确方法是什么?
更新:
我忘了指定我已经使用的标志:
PRAGMA synchronous = OFF
PRAGMA journal_mode = OFF
PRAGMA locking_mode = EXCLUSIVE
PRAGMA temp_store = MEMORY
Run Code Online (Sandbox Code Playgroud)
更新2: 我实际上是批量插入项目,但是每个下一批次的提交都比前一个更慢(我假设这与索引的大小有关).我尝试了10k到50k元组之间的批处理,每个元组是两个整数和一个浮点数.
我有一个带有python包的项目和一个已编译的组件.目前的目录布局是:
<project>
foo/
foo/__init__.py
foo/...
src/
src/c_foo.c
tests/
tests/test_foo.py
setup.py
Run Code Online (Sandbox Code Playgroud)
构建项目时,distutils会创建一个build/lib我添加PYTHONPATH或安装到虚拟环境中的目录.结果结构如下:
<project>
build/lib
build/lib/foo/__init__.py
build/lib/foo/c_foo.so
Run Code Online (Sandbox Code Playgroud)
问题在于,如果我从项目根目录启动python解释器会话,从项目根目录等运行测试,它会选择源树而不是构建树.
我找到了几个现有的解决方案:
将python源放在一个单独的目录下,例如.lib/foo,modules/foo等缺点就是额外的目录级别的所有源文件和不一致与不具有编译的扩展,因此有自己的Python包的根目录下的项目.
将包保留在根目录中,这意味着不得不chdir离开项目根目录(例如,进入tests /目录),以便python解释器不会看到源包(通过构建脚本或手动).
使用不同的名称(例如.foo-module或foo-lib)将包保留在根中,并使用适当的package_dir={'foo':'lib-foo'}行setup.py.这是pt的变种.1我没有额外级别的目录层次结构,这几乎是一回事.
将包保留在根目录中并使用setup.py build_ext --inplace,但这会污染源树.
这两种情况都引入了开销与普通python项目,其中可以从源树中修改/运行代码.我非常希望听到大家对上述优缺点的看法以及您为项目使用的特定方法.
我正在尝试在gtk.Builder定义文件中使用自定义容器小部件.就实例化这些小部件而言,它非常有用:
#!/usr/bin/env python
import sys
import gtk
class MyDialog(gtk.Dialog):
__gtype_name__ = "MyDialog"
if __name__ == "__main__":
builder = gtk.Builder()
builder.add_from_file("mydialog.glade")
dialog = builder.get_object("mydialog-instance")
dialog.run()
Run Code Online (Sandbox Code Playgroud)
现在问题是说我在该对话框中有一个gtk.TreeView小部件.我试图弄清楚如何将该窗口小部件绑定到MyDialog实例变量.
我能想到的一个便宜的替代方案是在获取对话框小部件后调用其他方法,如下所示:
dialog = builder.get_object("mydialog-instance")
dialog.bind_widgets(builder)
Run Code Online (Sandbox Code Playgroud)
但这似乎相当尴尬.有没有人已经解决了这个问题,或者对如何去做有更好的想法?
谢谢,
我正在考虑如何安排一个部署的python应用程序,它将具有
现在,我目前在源代码中有以下目录结构:
foo.py
foo/
__init__.py
...
Run Code Online (Sandbox Code Playgroud)
我想这不是最好的做事方式.在开发过程中,一切都按预期工作,但是在部署时,foo.py中的"from foo import FooObject"代码似乎试图导入foo.py本身,这不是我正在寻找的行为.
所以问题是编排这样的情况的标准做法是什么?我能想到的一件事是,在安装时,将foo.py重命名为foo,这会阻止它自动导入,但这看起来相当尴尬......
我认为问题的另一部分是这是一个命名挑战.也许调用可执行脚本foo-bin.py?
python ×5
package ×2
bind ×1
compiled ×1
conventions ×1
deploying ×1
distribution ×1
distutils ×1
extend ×1
gtk ×1
gtkbuilder ×1
indexing ×1
insert ×1
namespaces ×1
naming ×1
primary-key ×1
sqlite ×1
string ×1
subclass ×1
testing ×1