Migrating BSK Scripts to Python 3
With release Basilisk v0.8.x onward the software framework now supports using Python 3. The purpose of this document is to illustrate how to migrate Python 2 BSK scripts such that they will function in both Python 3 and Python 2. For the time being Python 2 is still supported as a depreciated functionality. But, python scripts committed to Basilisk should be written such that they support Python 3 and 2 for now. This document serves as compilation of BSK common syntactical adjustments needed to use Python 3. It is not a comprehensive list of the differences between Python 2 and Python 3.
Dividing Scalars
Python 2 and 3 treat the devide operator /
differently if two
integers operated on. Thus:
a = 3/2
resulted in an integer value of 1 in Python 2, but yields a float value of 1.5 in Python 3. To get the same result in Python 3 and 2, you can use either of the following options which work in both version of Python:
a = 3//2
a = 3./2
Without modification the user will see an error in Python 3 complaining about an unsupported type conversion:
File "/Users/hp/Documents/Research/Basilisk/dist3/Basilisk/simulation/sim_model/sim_model.py", line 4351, in logThisMessage
return _sim_model.SimModel_logThisMessage(self, messageName, messagePeriod)
NotImplementedError: Wrong number or type of arguments for overloaded function 'SimModel_logThisMessage'.
Possible C/C++ prototypes are:
SimModel::logThisMessage(std::string,uint64_t)
SimModel::logThisMessage(std::string)
Returning Lists Instead of Iterables
Python 3 removed iteritems()
method. The same functionality can be achieved in both Python 2 and 3 with items()
.
Range, Map, Zip
In Python 2 range() returns a list, while in Python 3 it returns an iterable object. To preserve functionality, cast as a list:
list(range(x))
Print
Print is treated as a statement in Python 2 and strictly a function in Python 3. For both 3 and 2:
print(x)
A sample warning is:
File "scenarioAttitudeFeedbackRW.py", line 715
print dataUsReq
^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print(dataUsReq)?
Strings
External python packages will give warnings in pytest
if
python strings include ‘’ where x is not a pythonic valid escape character. These warnings did not appear using Python 2, when using strings as input for latex or for other text processing, they should be made a raw string by appending an r:
r"..."
A sample warning is:
/Users/hp/Documents/Research/Basilisk/src/tests/testScripts/../scenarios/scenarioAttitudeFeedbackRW.py:91: DeprecationWarning: invalid escape sequence \o
label='$\omega_{BR,' + str(idx) + '}$')
Pyswice Imports
Changes to BSK module importing has changed the pyswice importing convention to be completely explicit:
From:
from Basilisk import pyswice
pyswice.spkRead(...)
To:
from Basilisk.pyswice.pyswice_spk_utilities import spkRead
spkRead(...)