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(...)