请参阅我的GitHub 项目。
可能有更好的方法可以满足您的需求。我为编程竞赛开发了这个项目/hack ,它只允许参赛者提交一个.py文件。这允许开发一个包含多个.py文件的项目,然后.py在最后将它们组合成一个文件。
@modulize我的 hack 是将函数转换为模块的装饰器。然后可以照常导入此模块。这是一个例子。
@modulize('my_module')
def my_dummy_function(__name__):  # the function takes one parameter __name__
    # put module code here
    def my_function(s): 
        print(s, 'bar')
    # the function must return locals()
    return locals()
# import the module as usual
from my_module import my_function
my_function('foo') # foo bar
我还有一个脚本,它可以将多个.py文件的项目组合在一起,这些文件相互导入到一个“.py”文件中。
例如,假设我有以下目录结构和文件:
my_dir/
    __main__.py
        import foo.bar
        fb = foo.bar.bar_func(foo.foo_var)
        print(fb) # foo bar
    foo/
        __init__.py
            foo_var = 'foo'
        bar.py
            def bar_func(x):
                return x + ' bar'
合并后的文件如下所示。顶部的代码定义了@modulize装饰器。
import sys
from types import ModuleType
class MockModule(ModuleType):
    def __init__(self, module_name, module_doc=None):
        ModuleType.__init__(self, module_name, module_doc)
        if '.' in module_name:
            package, module = module_name.rsplit('.', 1)
            get_mock_module(package).__path__ = []
            setattr(get_mock_module(package), module, self)
    def _initialize_(self, module_code):
        self.__dict__.update(module_code(self.__name__))
        self.__doc__ = module_code.__doc__
def get_mock_module(module_name):
    if module_name not in sys.modules:
        sys.modules[module_name] = MockModule(module_name)
    return sys.modules[module_name]
def modulize(module_name, dependencies=[]):
    for d in dependencies: get_mock_module(d)
    return get_mock_module(module_name)._initialize_
##===========================================================================##
@modulize('foo')
def _foo(__name__):
    ##----- Begin foo/__init__.py ------------------------------------------------##
    foo_var = 'foo'
    ##----- End foo/__init__.py --------------------------------------------------##
    return locals()
@modulize('foo.bar')
def _bar(__name__):
    ##----- Begin foo/bar.py -----------------------------------------------------##
    def bar_func(x):
        return x + ' bar'
    ##----- End foo/bar.py -------------------------------------------------------##
    return locals()
def __main__():
    ##----- Begin __main__.py ----------------------------------------------------##
    import foo.bar
    fb = foo.bar.bar_func(foo.foo_var)
    print(fb) # foo bar
    ##----- End __main__.py ------------------------------------------------------##
__main__()