【问题标题】:How do I import my own python files?如何导入我自己的 python 文件?
【发布时间】:2018-02-22 10:33:17
【问题描述】:

在一个名为 BinarySearch.py 的文件中,我有以下内容:

class SearchResult:    
    def __init__(self):
        self.was_found = False
        self.index = 0
    def __str__(self): 
        s = "SearchResult"
        s = s + "  was found:  "
        s = s + str(self.was_found) + "index:  " + str(self.index)
        return s

在另一个文件中,假设它被命名为file2.py 我有:

import os
cwd = os.getcwd()
import sys
sys.path.append(cwd)

import BinarySearch

但是,当我尝试运行 file2.py 时,我收到以下错误消息:

NameError: name 'SearchResult' is not defined

看起来import BinarySearch 实际上并未导入BinarySearch

我正在使用 Spyder IDE。两个文件(BinarySearch.pyfile2.py)都在同一个目录中。另外,我去了 Tool > PYTHONPATH manager 并将目录添加到路径中。我还尝试重新启动 spyder 以查看这是否是路径更改生效所必需的。还是不行。

编辑:

file2.py 中引发错误的行如下:

sr = SearchResult()

最初我假设语句import BinarySearch 的行为与复制 BinarySearch.py​​ 的全部内容并将其粘贴到import 语句在 file2.py 中的位置相同。我现在明白import 不是这样工作的。

【问题讨论】:

    标签: python python-3.x import python-import spyder


    【解决方案1】:

    当前目录已经在路径中,无需您以任何方式(通过 IDE 或通过 sys.path)显式将其放置在该路径中

    在你的第二段代码中,你错过了我认为给你错误的最后一行,很可能是这样的

    print(SearchResult())
    

    应该是

    print(BinarySearch.SearchResult())
    

    或者您可以将导入更改为

    from BinarySearch import SearchResult
    

    然后你就可以做

    print(SearchResult())
    

    【讨论】:

    • from BinarySearch import SearchResult 是不够的。 BinarySearch.py​​文件里面还有其他东西,除了SearchResult,我也需要。
    • 在这种情况下,要么使用 import BinarySearch 并使用模块名称引用每个事物:BinarySearch.SearchResultBinarySearch.SomethingElse,... 或使用 from BinarySearch import SearchResult, SomethingElse。另一种选择是使用from BinarySearch import *,这样您就可以使用 BinarySearch 中的所有内容,但这是discouraged
    【解决方案2】:

    一种解决方案似乎是从

    更改导入语句
    import BinarySearch
    

    到:

    from BinarySearch import *
    

    星号本质上表示“全部导入”,它从文件BinarySearch.py 中导入所有内容,包括SearchResult 类。

    普通的简单导入也会导入所有内容,但会强制您通过命名空间访问内容。文件BinarySearch.py 中的所有内容现在都在命名空间BinarySearch 中。我们可以不理会原来的import 语句,但是任何时候我们在file2.py 中使用来自BinarySearch 的东西,我们都必须添加一个前缀。我们的代码如下所示:

    # inside file named file2.py
    sr = BinarySearch.SearchResult()
    

    如果我们厌倦了一直写BinarySearch.,我们可以为命名空间创建一个别名,如下所示:

    import BinarySearch as bs
    

    然后,在file2.py 内部,sr = bs.SearchResult() 语句就可以正常工作了。

    【讨论】:

      猜你喜欢
      • 2018-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-23
      • 2018-06-21
      • 1970-01-01
      相关资源
      最近更新 更多