2013-08-22 193 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__()