在名为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.py
和file2.py
)都在同一目录中。另外,我去了工具> PYTHONPATH经理并将目录添加到路径中。我还尝试重新启动spyder以查看路径更改生效所需的内容。它仍然无效。
修改
引发错误的file2.py
中的行如下:
sr = SearchResult()
最初我假设语句import BinarySearch
具有相同的行为,就好像我复制了BinarySearch.py的全部内容并将其粘贴到import
语句在file2.py中的位置。我现在看到的不是import
的工作方式。
答案 0 :(得分:4)
当前目录已经在路径中,您无需以任何方式明确地将其放在那里(通过IDE或通过sys.path)
在你的第二段代码中,你错过了我认为给你错误的最后一行,而且很可能是
print(SearchResult())
应该是
print(BinarySearch.SearchResult())
或者您可以将导入更改为
from BinarySearch import SearchResult
然后你可以做到
print(SearchResult())
答案 1 :(得分:0)
一个解决方案似乎是从
更改import语句import BinarySearch
为:
from BinarySearch import *
星号/星号本质上意味着"全部导入,"从文件BinarySearch.py
导入所有内容,包括SearchResult
类。
常规简单导入也会导入所有内容,但会强制您通过命名空间访问内容。文件BinarySearch.py
中的所有内容现在都在命名空间BinarySearch
内。我们可以单独保留原始import
语句,但只要我们使用来自file2.py
的{{1}}中的内容,我们就必须添加前缀。我们的代码看起来像这样:
BinarySearch
如果我们厌倦了事先写# inside file named file2.py
sr = BinarySearch.SearchResult()
,我们可以为命名空间创建一个别名,如下所示:
BinarySearch.
然后,在import BinarySearch as bs
内,语句file2.py
将正常工作。