请参阅我的GitHub project。
可能有更好的方法满足您的需求。我开发了这个项目/破解编程比赛其中只允许参赛者提交一个.py
文件。这允许人们开发一个具有多个.py
文件的项目,然后在最后将它们合并成一个.py
文件。
我的破解是一个修饰器@modulize
它将函数转换为模块。然后可以像平常一样导入该模块。这是一个例子。
@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__()
为什么不使用版本控制(git)? – elyase
@elyase这只是一个补丁程序,因为我们还没有购买适当的软件。版本控制不是我所关心的,但是合并成1个脚本是。感谢您的快速响应 –
尽可能多地模块化,这样我就可以在不影响最终脚本的情况下取出不符合我需求的脚本。 –