Difference between revisions of "UHD Python API"
(Created blank page) |
MartinBraun (Talk | contribs) (Not finished yet) |
||
Line 1: | Line 1: | ||
+ | == What's the UHD Python API? == | ||
+ | As the name suggests, it exposes the UHD API into Python. We use Boost.Python | ||
+ | to generate a Python module which exposes most of the C++ API, and some extra | ||
+ | features. | ||
+ | |||
+ | The Python API is currently in a public beta test. We very much encourage users | ||
+ | to try it out and voice their feedback. It is our intention to merge this API | ||
+ | into the master branch soon, and ship it as a regular feature. | ||
+ | |||
+ | The pre-release announcement covers most of the information: | ||
+ | |||
+ | <pre> | ||
+ | Hi all, | ||
+ | |||
+ | some people have already heard the rumour that we're working on a Python | ||
+ | API for UHD that does not involve gr-uhd. And yes, it's true. A minute | ||
+ | ago, I published our current development branch on github: | ||
+ | |||
+ | https://github.com/EttusResearch/uhd/tree/python-api | ||
+ | |||
+ | We'll be doing some more development on this branch before we're merging | ||
+ | it, but most importantly, we'd like to get some feedback from the | ||
+ | greater community. | ||
+ | |||
+ | The biggest thing missing is more documentation, but it already includes | ||
+ | some examples. It's definitely ready for testing! | ||
+ | If you have feedback, post it either in this thread, or on github: | ||
+ | https://github.com/EttusResearch/uhd/issues/105 | ||
+ | |||
+ | I've tried to preempt some questions: | ||
+ | |||
+ | - Does it support Python 2 and 3? Yes. | ||
+ | - Does it use SWIG? No, it uses Boost.Python. We didn't want to add | ||
+ | another dependency to UHD (i.e., SWIG) and Boost was already a | ||
+ | dependency of UHD. It also doesn't require the C API. | ||
+ | - How does this relate to the Python API in gr-uhd? It serves an | ||
+ | entirely different purpose. This Python API is for people writing | ||
+ | standalone applications for USRPs that *don't* use GNU Radio. gr-uhd is | ||
+ | staying the way it is, and is going nowhere. If you're using GNU Radio, | ||
+ | you probably don't care about this. | ||
+ | - Are the UHD Python API and the gr-uhd Python API compatible? Short | ||
+ | answer: No. Long answer: There are very few cases where it makes sense | ||
+ | to mix these APIs, so no. However, this means that a TimeSpec from the | ||
+ | Boost.Python API is not convertible into a time_spec_t from the gr-uhd API. | ||
+ | - When will it be released? TBD, but if we hear a lot of encouragement | ||
+ | that'll drive things along faster. It'll go into master branch whenever | ||
+ | it's considered stable enough, and then in the first major release after | ||
+ | that merge. | ||
+ | - Does it support RFNoC API? Not yet, but it's not hard to add. We | ||
+ | wanted to get the basics (i.e. multi_usrp API) right first. | ||
+ | - What's the streaming performance? Worse than straight C++. Better than | ||
+ | I would have thought, thanks to numpy. We have no benchmarks yet. | ||
+ | Overall, recv() calls are pretty efficient if you've preallocated a | ||
+ | numpy array, because we can cast that to a straight pointer (and also | ||
+ | skip any type checking!!!!!!) and then it's not that different from a | ||
+ | recv() call in a C++ app. However, consuming the data is limited by how | ||
+ | fast you can handle that in Python. | ||
+ | </pre> | ||
+ | |||
+ | == How can I use it? == | ||
+ | |||
+ | In order to test the Python API, check out the python-api branch (see: | ||
+ | https://github.com/EttusResearch/uhd/tree/python-api) and build it like any | ||
+ | other UHD branch. When running CMake, make sure that the Python API was enabled. | ||
+ | |||
+ | The output from CMake should look something like this: | ||
+ | |||
+ | <pre> | ||
+ | -- ###################################################### | ||
+ | -- # UHD enabled components | ||
+ | -- ###################################################### | ||
+ | -- * LibUHD | ||
+ | -- * LibUHD - C API | ||
+ | -- * LibUHD - Python API | ||
+ | -- * Examples | ||
+ | -- * Utils | ||
+ | -- * Tests | ||
+ | -- * USB | ||
+ | -- * B100 | ||
+ | -- * B200 | ||
+ | -- * USRP1 | ||
+ | -- * USRP2 | ||
+ | -- * X300 | ||
+ | -- * N230 | ||
+ | -- * OctoClock | ||
+ | -- * Manual | ||
+ | -- * API/Doxygen | ||
+ | -- * Man Pages | ||
+ | -- | ||
+ | -- ###################################################### | ||
+ | -- # UHD disabled components | ||
+ | -- ###################################################### | ||
+ | -- * GPSD | ||
+ | -- * E100 | ||
+ | -- * E300 | ||
+ | </pre> | ||
+ | |||
+ | Once it's built and installed, you'll be able to import the '''uhd''' Python | ||
+ | module: | ||
+ | |||
+ | <syntaxhighlight lang="python"> | ||
+ | >>> import uhd | ||
+ | >>> my_usrp = uhd.usrp.MultiUSRP("type=b200") | ||
+ | >>> my_usrp.set_rx_gain(70) | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | We have some examples in '''host/examples/python'''. The examples are very | ||
+ | simple, but concise. | ||
+ | |||
+ | == What about documentation? == | ||
+ | |||
+ | Documentation is currently pretty sparse. The best we can do right now is to ask | ||
+ | users to infer the documentation from |
Revision as of 15:59, 10 July 2017
What's the UHD Python API?
As the name suggests, it exposes the UHD API into Python. We use Boost.Python to generate a Python module which exposes most of the C++ API, and some extra features.
The Python API is currently in a public beta test. We very much encourage users to try it out and voice their feedback. It is our intention to merge this API into the master branch soon, and ship it as a regular feature.
The pre-release announcement covers most of the information:
Hi all, some people have already heard the rumour that we're working on a Python API for UHD that does not involve gr-uhd. And yes, it's true. A minute ago, I published our current development branch on github: https://github.com/EttusResearch/uhd/tree/python-api We'll be doing some more development on this branch before we're merging it, but most importantly, we'd like to get some feedback from the greater community. The biggest thing missing is more documentation, but it already includes some examples. It's definitely ready for testing! If you have feedback, post it either in this thread, or on github: https://github.com/EttusResearch/uhd/issues/105 I've tried to preempt some questions: - Does it support Python 2 and 3? Yes. - Does it use SWIG? No, it uses Boost.Python. We didn't want to add another dependency to UHD (i.e., SWIG) and Boost was already a dependency of UHD. It also doesn't require the C API. - How does this relate to the Python API in gr-uhd? It serves an entirely different purpose. This Python API is for people writing standalone applications for USRPs that *don't* use GNU Radio. gr-uhd is staying the way it is, and is going nowhere. If you're using GNU Radio, you probably don't care about this. - Are the UHD Python API and the gr-uhd Python API compatible? Short answer: No. Long answer: There are very few cases where it makes sense to mix these APIs, so no. However, this means that a TimeSpec from the Boost.Python API is not convertible into a time_spec_t from the gr-uhd API. - When will it be released? TBD, but if we hear a lot of encouragement that'll drive things along faster. It'll go into master branch whenever it's considered stable enough, and then in the first major release after that merge. - Does it support RFNoC API? Not yet, but it's not hard to add. We wanted to get the basics (i.e. multi_usrp API) right first. - What's the streaming performance? Worse than straight C++. Better than I would have thought, thanks to numpy. We have no benchmarks yet. Overall, recv() calls are pretty efficient if you've preallocated a numpy array, because we can cast that to a straight pointer (and also skip any type checking!!!!!!) and then it's not that different from a recv() call in a C++ app. However, consuming the data is limited by how fast you can handle that in Python.
How can I use it?
In order to test the Python API, check out the python-api branch (see: https://github.com/EttusResearch/uhd/tree/python-api) and build it like any other UHD branch. When running CMake, make sure that the Python API was enabled.
The output from CMake should look something like this:
-- ###################################################### -- # UHD enabled components -- ###################################################### -- * LibUHD -- * LibUHD - C API -- * LibUHD - Python API -- * Examples -- * Utils -- * Tests -- * USB -- * B100 -- * B200 -- * USRP1 -- * USRP2 -- * X300 -- * N230 -- * OctoClock -- * Manual -- * API/Doxygen -- * Man Pages -- -- ###################################################### -- # UHD disabled components -- ###################################################### -- * GPSD -- * E100 -- * E300
Once it's built and installed, you'll be able to import the uhd Python module:
>>> import uhd
>>> my_usrp = uhd.usrp.MultiUSRP("type=b200")
>>> my_usrp.set_rx_gain(70)
We have some examples in host/examples/python. The examples are very simple, but concise.
What about documentation?
Documentation is currently pretty sparse. The best we can do right now is to ask users to infer the documentation from