Option 3 seems to work. Just be careful that module1 and module2 aren’t being modified by anything outside.
I think if you wanted to make it nicer, instead of passing in an initialized module, you could pass in a function that takes no arguments but initializes a module. Something like:
lambda: Module1(...), but that’s just personal preference.