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 pypxlib
pypxlib exposes a high-level API for reading Paradox databases. To use this API, you need the following import:
from pypxlib import Table
Get 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)
123
Get the first row:
>>> row = table[0]
>>> row
Row(field1=13, field2='foo')
Access a row’s properties:
>>> row.field1
13
>>> row['field1']
13
Iterate 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]
20
Do 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 install
sudo 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-x86
andC:\pxlib-0.6.5-x64
. - Start the Visual C++ 2008 32-bit Command Prompt, cd to
C:\pxlib-0.6.5-x86
and 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.dll
and the 64 bit dll inC:\pxlib-0.6.5-x64\pxlib.dll
.