【问题标题】:How to import modules from a separate directory?如何从单独的目录导入模块?
【发布时间】:2016-06-18 05:49:57
【问题描述】:

我想从不同的目录导入 asyncore,因为我需要对 asyncore 的工作方式进行一些更改,并且不想修改基础文件。

我可以将它与我的脚本一起包含在文件夹中,但是在将我需要的所有模块放在那里之后,它最终变得相当混乱。

我很清楚创建一个子目录并将一个空白的 __init__.py 文件放入其中。这不起作用。我不确定会发生什么,但是当我从子目录导入 asyncore 时,asyncore 完全停止工作。具体来说;连接方法根本没有运行,即使我正在调用它。将 asyncore 移动到主目录并导入它通常会消除此问题。

我大量浏览了我的代码,但这仍然存在同样的问题:

from Modules import asyncore
from Modules import asynchat
from Modules import socket

class runBot(asynchat.async_chat, object):

    def __init__(self):

        asynchat.async_chat.__init__(self)
        self.connect_to_twitch()

    def connect_to_twitch(self):

        self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
        self.connect(('irc.chat.twitch.tv',6667))
        self.set_terminator('\n')
        self.buffer=[]


    def collect_incoming_data(self, data):  
        self.buffer.append(data)    

    def found_terminator(self):
        msg = ''.join(self.buffer)
        print(msg)


if __name__ == '__main__':  


    # Assign bots to channels
    bot = runBot()

    # Start bots
    asyncore.loop(0.001)

我确定这是我忽略的非常简单的事情,但我无法弄清楚。

【问题讨论】:

  • Importing files from different folder in Python 的可能重复项请务必查看第二个答案。
  • 哦,来吧。我特别指出,使用 init.py 文件是行不通的。第一个答案应该有效,尽管它不是很漂亮。如果存在替代方案,我将不胜感激,或者解释为什么当通过包含 init.py 的子文件夹导入时 asyncore 无法正常工作。

标签: python-3.x asyncore


【解决方案1】:

使用sys.path.append——详情请参阅https://docs.python.org/3/tutorial/modules.html

更新:尝试在模块源代码的开头和结尾放置一个调试打印,以查看它们是否按预期导入。您还可以为要用于查看的模块/对象打印 __file__ 属性,无论您是否导入了预期的内容——例如:

import re
#...
print(re.__file__)

【讨论】:

  • 实际上,您会使用 sys.path.insert(0,path)。使用 append 可以使它成为检查的最后一个地方,而我需要它成为第一个检查的地方。否则我修改后的 asyncore 将永远找不到。另外,这有点hacky。这是我一直在使用的,但如果它存在的话,我真的想要一个更漂亮的替代品。
  • 我同意。这取决于情况。请参阅上面的更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-02
  • 2019-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-19
相关资源
最近更新 更多