2012-04-04 57 views
1

所以我有一個目錄樹如下:在Windows編程進口的作品,但不能在Linux上

pluginlist.py 
plugins/ 
    __init__.py 
    plugin1.py 
    plugin2.py 
    ... 

而且想連接一個類似命名的字典從每個plugin1的,plugin2等

我這樣做的方式是(從pluginlist.py)如下:

import os 

pluginFolderName = "plugins" 
pluginFlag = "##&plugin&##" 

commands = {} 

os.chdir(os.path.abspath(pluginFolderName)) 

for file in os.listdir(os.getcwd()): 
    if os.path.isfile(file) and os.path.splitext(file)[1] == ".py": 
     fileo = open(file, 'r') 
     firstline = fileo.readline() 
     if firstline == "##&plugin&##\n": 
      plugin_mod = __import__("plugins.%s" % os.path.splitext(file)[0]) 
      import_command = "plugin_commands = plugin_mod.%s" %  os.path.splitext(file)[0] 
      exec import_command 
      commands = dict(commands.items() + plugin_commands.commands.items()) 
print commands 

(打印命令也用於測試目的)

在Windows上運行該命令會提供正確的命令字典,但在Linux(Ubuntu Server)上運行它會提供一個空字典。

+1

你不能使用'plugin_commands = getattr(plugin_mod,os.path.splitext(file)[0])'而不是'exec'嗎? – Blender 2012-04-04 02:53:57

回答

0

想通了我的問題!

os.path.isfile(file) 

測試不起作用,因爲Linux想要一個插件文件的絕對路徑。所以用

os.path.join(os.getcwd(), file) 

替換文件的所有實例似乎修復一切。

2

嘗試:

for file in os.listdir(os.getcwd()): 
    basename, ext = os.path.splitext(file) 
    if os.path.isfile(file) and ext == ".py": 
     with open(file, 'r') as fileo: 
      firstline = fileo.readline() 
      if firstline.startswith("##&plugin&##"): 
       plugin_mod = __import__("plugins.%s" % basename, fromlist = [True]) 
       plugin_commands = getattr(plugin_mod, basename) 
       commands.update(plugin_commands.commands) 

當你調用__import__('A.B'),返回包A。 當您撥打__import__('A.B', fromlist = [True])時,返回模塊B。在我看來,你想要B。因此,在Windows和Linux上,您都需要將fromlist設置爲非空列表。

+0

這不是它失敗的原因,但它仍然有助於更通俗地做事,所以謝謝 – glittershark 2012-04-04 18:22:09

0

您的源代碼是否有Windows CRLF行結尾?嘗試添加print repr(firstline)以檢查它是否以\r\n而不是\n結尾。

0

我會把一個else:分支上if聲明,如果一個插件缺少標識

而且它打印警告,你可能不關心行結尾,因此調用firstline.strip()時檢查可能會解決您問題

最後,迂腐,你可以加入filepluginFolderName路徑,而不是使用os.chdir()

未測試:

pluginFolderName = "plugins" 
pluginFlag = "##&plugin&##" 

pluginFolderName = os.path.abspath(pluginFolderName) 

commands = {} 
for file in os.listdir(pluginFolderName): 
    # Construct path to file (instead of relying on the cwd) 
    file = os.path.join(pluginFolderName, file) 

    if os.path.isfile(file) and os.path.splitext(file)[1] == ".py": 
     fileo = open(file, 'r') 
     firstline = fileo.readline() 

     if firstline.strip() == pluginFlag: 
      # Strip firstline to ignore trailing whitespace 

      plugin_mod = __import__("plugins.%s" % os.path.splitext(file)[0]) 
      plugin_cmds = getattr(plugin_mod, os.path.splitext(file)[0]) 
      commands.update(plugin_cmds) 
     else: 
      print "Warning: %s is missing identifier %r, first line was %r" % (
       file, PLUGIN_IDENTIFIER, firstline) 
相關問題