You can use the bounds parameter of PortfolioOptimization. By default, bounds = None, which assume that all variables x_i are binaries.
If you want to release the constrain, you can set bounds = [(x_1_min, x_1_max), (x_2_min, x_2_max), ...] where x_i_max/x_i_min is the upper/lower bound of x_i, and the length of the list has to equal to the number of variable. If all variables share the same upper bound, you can simplify the input as bounds = [(x_lower_bound, x_upper_bound)] * num_variable.
Example:
x_lower_bound = 0
x_upper_bound = budget
num_variable = 4
portfolio = PortfolioOptimization(expected_return, covariance, risk_factor, budget, bounds=[(x_lower_bound, x_upper_bound)] * num_variable)