Python bindings for the pxlib library for reading and writing Paradox databases. The version of pxlib currently exposed by pypxlib is 0.6.5.
pip install pypxlibpypxlib exposes a high-level API for reading Paradox databases. To use this API, you need the following import:
from pypxlib import TableGet the fields in a table:
>>> table = Table('data.db')
>>> table.fields
OrderedDict([('field1', <pypxlib.LongField object at 0x1072c6710>),
('field2', <pypxlib.AlphaField object at 0x10731ffd0>)]Get the number of rows:
>>> len(table)
123Get the first row:
>>> row = table[0]
>>> row
Row(field1=13, field2='foo')Access a row’s properties:
>>> row.field1
13
>>> row['field1']
13Iterate over all rows:
>>> for row in table:
... print(row)
...
Row(field1=13, field2='foo')
Row(field2=87, field2='bar')
...There is limited support for modifying tables:
>>> row = table[0]
>>> row.field1 = 20
>>> row.save()
>>> table[0]
20Do note that you must call .save(...) on the exact Row object that you
modified. That is, the following will not work:
>>> # This does not work!
>>> table[0].field1 = 20
>>> table[0].save()Rows can also be inserted. This is done by passing a tuple of objects to
table.insert(...). The elements of the tuple must have exactly the types
given by the table's .fields property:
>>> table.fields
OrderedDict([('field1', <pypxlib.LongField object at 0x1072c6710>),
('field2', <pypxlib.AlphaField object at 0x10731ffd0>)]
>>> table.insert((50, 'Some text'))
2
>>> table[2]
Row(field1=50, field2='Some text')Deleting a row can be done via the del keyword:
>>> del table[2]Finally, don't forget to close the table when you are done!
table = Table('data.db')
try:
# Process the table...
finally:
table.close()Or use it as a context manager:
with Table('data.db') as table:
# Process the table...pypxlib is esentially a thin wrapper around the pxlib C library. The high-level API described above makes it easy to read tables but offers limited support when it comes to writing tables. If you also need to write to a table, or another more complicated use case, then you can fall back to the ctypes bindings of pxlib exposed by this library:
from pypxlib.pxlib_ctypes import *
pxdoc = PX_new()
PX_open_file(pxdoc, b"test.db")
num_fields = PX_get_num_fields(pxdoc)
print('test.db has %d fields:' % num_fields)
for i in range(num_fields):
field = PX_get_field(pxdoc, i)
print(field.contents.px_fname)
# Close the file:
PX_close(pxdoc)
# Free the memory associated with pxdoc:
PX_delete(pxdoc)All the PX_... functions come directly from the list of pxlibs functions.
Note that you do not need to call PX_boot() and PX_shutdown, as these
functions are already called when importing pypxlib, and via an
atexit handler.
This library was tested on the following platforms:
- Windows 10 64-bit using Python 2.7.17 (x86 and x64) and Python 3.8.2 (x86 and x64)
- OS X: Python 2.7.10 and 3.4.2.
- Ubuntu 18.04.4 64-bit and 32-bit using Python 2.7.17 and Python 3.7.5 / 3.6
The dynamic libraries libpx.so, pxlib.dll (pxlib_x64.dll),
and libpx.dylib were obtained from building pxlib 0.6.5 on Ubuntu
14.0.4.1, Windows 7 and Mac OS X 10.10.5, respectively.
See Building pxlib below.
This project contains dynamic libraries for version 0.6.5 of the pxlib library. Here, the steps that were necessary to compile the library on the various operating systems are documented.
sudo apt-get update
sudo apt-get install build-essential
wget 'http://downloads.sourceforge.net/project/pxlib/pxlib/0.6.5/pxlib-0.6.5.tar.gz?ts='`date +%s`'&use_mirror=freefr' -O pxlib-0.6.5.tar.gz
tar -zxvf pxlib-0.6.5.tar.gz
cd pxlib-0.6.5/
./configure
make
sudo make installsudo brew install intltool
sudo brew link xy
sudo brew install gettext
curl -L 'http://downloads.sourceforge.net/project/pxlib/pxlib/0.6.5/pxlib-0.6.5.tar.gz?ts='`date +%s`'&use_mirror=freefr' -o pxlib-0.6.5.tar.gz
tar -zxvf pxlib-0.6.5.tar.gz
cd pxlib-0.6.5/
echo './configure --prefix=`pwd`/out' | brew sh
sed -i '' 's/#define HAVE_LOCALE_H 1//' config.h
sed -i '' "/^CFLAGS =/ s/$/ -mmacosx-version-min=10.5/" Makefile
make
make install- Download & install the Microsoft Visual C++ Compiler for Python 2.7.
- Download and install CMake.
- Download the pxlib 0.6.5 sources from http://sourceforge.net/projects/pxlib/files/latest/download?source=files .
- Extract the pxlib sources to two directories for 32 and 64 bit,
respectively. Eg.
C:\pxlib-0.6.5-x86andC:\pxlib-0.6.5-x64. - Start the Visual C++ 2008 32-bit Command Prompt, cd to
C:\pxlib-0.6.5-x86and execute the following commands:
cmake -D CMAKE_CXX_FLAGS_RELEASE=/MT -DCMAKE_BUILD_TYPE=Release -D PX_HAVE_ICONV=0 -D PX_HAVE_RECODE=0 .
nmake- Repeat step 5. with the 64-bit Command Prompt and
C:\pxlib-0.6.5-x64. - That's it. You now have the 32 bit dll in
C:\pxlib-0.6.5-x86\pxlib.dlland the 64 bit dll inC:\pxlib-0.6.5-x64\pxlib.dll.