2013-08-22 192 views
2

我正在使用python + splinter进行浏览器自动化。 我的结构是这样的Python将.py部分文件合并为一个.py文件

[root] 
+--start.py 
+--end.py 
+--[module1] 
| +--mod11area1.py 
| +--mod12area2.py 
| +--[module1_2] 
| | +--mod121area1.py 
| +--[module1_3] 
|  +--mod131area1.py 
+--[module2] 
    +--mod21area1.py 

start.py设置初始化和浏览器 的开内modules.py通过附加执行每个模块 行动这种结构将被执行后合并到一个脚本内容在此FASION:

start.py 
mod11area1.py 
mod12area2.py 
mod121area1.py 
mod131area1.py 
mod21area1.py 
end.py 

我的问题是,有没有这样做的更好的办法?我对此很新,只是通常创建一个脚本。由于我的项目不断扩大,我不得不聘请其他几个人来跟我一起编写脚本。因此我提出了这种方法。

+0

为什么不使用版本控制(git)? – elyase

+0

@elyase这只是一个补丁程序,因为我们还没有购买适当的软件。版本控制不是我所关心的,但是合并成1个脚本是。感谢您的快速响应 –

+0

尽可能多地模块化,这样我就可以在不影响最终脚本的情况下取出不符合我需求的脚本。 –

回答

-1

而不是将内容追加到一个* .py文件中,为什么不直接从团队中其他人写的代码中导入所需的内容?

3

不,Python没有简单的方法将脚本合并到一个.py文件中。

但是你可以伪造它,虽然方式相当有限。


下面是如何在单个文件中定义多个模块(每个模块都有自己的命名空间)的示例。

但具有以下限制。

  • 没有包支持
    (虽然这可能会工作)。
  • 不支持取决于彼此的模块
    (除非已经定义了模块,否则不能导入模块)。

示例 - 2模块,每个模块包含一个函数:

# Fake multiple modules in a single file. 
import sys 
_globals_init = None # include ourself in namespace 
_globals_init = set(globals().keys()) 

# ------------------------ 
# ---- begin 
__name__ = "test_module_1" 
__doc__ = "hello world" 

def test2(): 
    print(123) 


sys.modules[__name__] = type(sys)(__name__, __doc__) 
sys.modules[__name__].__dict__.update(globals()) 
[globals().__delitem__(k) for k in list(globals().keys()) if k not in _globals_init] 
# ---- end ------------ 


# --------------------- 
# ---- begin 
__name__ = "some_other" 
__doc__ = "testing 123" 

def test1(): 
    print(321) 


sys.modules[__name__] = type(sys)(__name__, __doc__) 
sys.modules[__name__].__dict__.update(globals()) 
[globals().__delitem__(k) for k in list(globals().keys()) if k not in _globals_init] 
# ---- end ------------ 


# ---------------- 
# ---- example use 

import test_module_1 
test_module_1.test2() 

import some_other 
some_other.test1() 

# this will fail (as it should) 
test1() 

注意,这不是很好的做法,如果你有这样的问题,你可能有一些可选的解决方案更好(如使用https://docs.python.org/3/library/zipimport.html

0

请参阅我的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__()