python 中未使用函数的重新定义
redefinition of unused function in python
我在同一文件夹 utils.py
和 preprocessing.py
中有 2 个 python 文件。
我在 utils.py 文件中定义了两个函数:preprocess_text, text2seq_generator
我需要在 preprocessing.py
中使用这些 functions
。但是我越来越无法导入并警告说 redefinition of unused preprocess_text from line 19
代码:
utils.py
from __future__ import print_function
from collections import defaultdict
from collections import Counter
from string import punctuation
#import pdb
def filter_text(text):
return ''.join([c for c in text if c not in punctuation]).lower()
def preprocess_text(file_path_src, file_path_tar, max_feats):
f_src = open(file_path_src)
f_tar = open(file_path_tar)
vocab = defaultdict(int)
freq_src = defaultdict(int)
freq_tar = defaultdict(int)
sents_src = [line.rstrip() for line in f_src.readlines()]
sents_tar = [line.rstrip() for line in f_tar.readlines()]
for sent in sents_src:
sent = filter_text(sent)
for word in sent.split():
freq_src[word] += 1
for sent in sents_tar:
for word in sent.split():
freq_tar[word] += 1
freq_sorted_src = Counter(freq_src)
freq_sorted_src = freq_sorted_src.most_common(max_feats)
freq_sorted_tar = Counter(freq_tar)
freq_sorted_tar = freq_sorted_tar.most_common(max_feats)
freq_words_src = map(lambda x:x[0], freq_sorted_src)
freq_words_tar = map(lambda x:x[0], freq_sorted_tar)
vocab_src = dict({v:k for k, v in enumerate(freq_words_src)})
vocab_tar = dict({v:k for k, v in enumerate(freq_words_tar)})
vocab_src["UNK"] = max_feats
vocab_src["<s>"] = max_feats + 1
vocab_src["</s>"] = max_feats + 2
vocab_tar["UNK"] = max_feats
vocab_tar["<s>"] = max_feats + 1
vocab_tar["</s>"] = max_feats + 2
#pdb.set_trace()
return vocab_src, vocab_tar, sents_src, sents_tar
def text2seq_generator(vocab_src, vocab_tar, sents_src, sents_tar):
unk_key = vocab_src["UNK"]
for sent_src, sent_tar in zip(sents_src, sents_tar):
seq_src = map(lambda x:vocab_src.get(x, unk_key), filter_text(sent_src).split())
seq_tar = map(lambda x:vocab_tar.get(x, unk_key), sent_tar.split())
#pdb.set_trace()
yield seq_src, seq_tar
#vs, vt, ss, st = preprocess_text('../data/training.hi-en.en', '../data/training.hi-en.hi', 5000)
#for x,y in text2seq_generator(vs, vt, ss, st):
#print(y)
preprocessing.py 文件:
from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequences
import codecs
import pdb
import numpy as np
from utils import preprocess_text,text2seq_generator
错误:
from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequences
import codecs
import pdb
import numpy as np
from utils import preprocess_text
Traceback (most recent call last):
File "<ipython-input-8-335a30ab7871>", line 6, in <module>
from utils import preprocess_text
ImportError: cannot import name 'preprocess_text'
警告:
redefinition of unused preprocess_text from line 19
选项 1
您从 python IDE 运行 它(而不是从命令行 运行 宁它)。然后 IDE(至少对于 spyder 是这样)将在 path
环境变量中查找 utils.py
脚本。最有可能不存在。
解决方案 1
在脚本开头添加这些行:
import sys
sys.path.insert(0, 'directory_of_utils.py_script')
from utils import preprocess_text, text2seq_generator
或者只是更改您的工作目录:
import os
os.chdir('directory_of_utils.py_script')
from utils import preprocess_text, text2seq_generator
选项 2
您已经安装了模块 utils
。因此,脚本将尝试在该模块中找到函数 preprocess_text
(顺便说一句:如果您通过命令行 运行 就不会发生这种情况)。
解决方案 2
重命名 utils.py
(如果 运行ning 来自 IDE 添加解决方案 1 中的行!)。
您的 PYTHONPATH
中某处似乎有另一个名为 utils
的包,它与您当前的文件冲突。
您可以使用 importlib
模块从其路径显式加载模块。
将这些行添加到 preprocessing.py
(python 3.3 和 3.4):
from importlib.machinery import SourceFileLoader
utils = SourceFileLoader("utils", "/path/to/utils.py").load_module()
utils.preprocess_text(...)
对于python3.5+,你应该使用:
import importlib.util
spec = importlib.util.spec_from_file_location("utils", "/path/to/utils.py")
utils = importlib.util.module_from_spec(spec)
spec.loader.exec_module(utils)
utils.preprocess_text(...)
我在同一文件夹 utils.py
和 preprocessing.py
中有 2 个 python 文件。
我在 utils.py 文件中定义了两个函数:preprocess_text, text2seq_generator
我需要在 preprocessing.py
中使用这些 functions
。但是我越来越无法导入并警告说 redefinition of unused preprocess_text from line 19
代码:
utils.py
from __future__ import print_function
from collections import defaultdict
from collections import Counter
from string import punctuation
#import pdb
def filter_text(text):
return ''.join([c for c in text if c not in punctuation]).lower()
def preprocess_text(file_path_src, file_path_tar, max_feats):
f_src = open(file_path_src)
f_tar = open(file_path_tar)
vocab = defaultdict(int)
freq_src = defaultdict(int)
freq_tar = defaultdict(int)
sents_src = [line.rstrip() for line in f_src.readlines()]
sents_tar = [line.rstrip() for line in f_tar.readlines()]
for sent in sents_src:
sent = filter_text(sent)
for word in sent.split():
freq_src[word] += 1
for sent in sents_tar:
for word in sent.split():
freq_tar[word] += 1
freq_sorted_src = Counter(freq_src)
freq_sorted_src = freq_sorted_src.most_common(max_feats)
freq_sorted_tar = Counter(freq_tar)
freq_sorted_tar = freq_sorted_tar.most_common(max_feats)
freq_words_src = map(lambda x:x[0], freq_sorted_src)
freq_words_tar = map(lambda x:x[0], freq_sorted_tar)
vocab_src = dict({v:k for k, v in enumerate(freq_words_src)})
vocab_tar = dict({v:k for k, v in enumerate(freq_words_tar)})
vocab_src["UNK"] = max_feats
vocab_src["<s>"] = max_feats + 1
vocab_src["</s>"] = max_feats + 2
vocab_tar["UNK"] = max_feats
vocab_tar["<s>"] = max_feats + 1
vocab_tar["</s>"] = max_feats + 2
#pdb.set_trace()
return vocab_src, vocab_tar, sents_src, sents_tar
def text2seq_generator(vocab_src, vocab_tar, sents_src, sents_tar):
unk_key = vocab_src["UNK"]
for sent_src, sent_tar in zip(sents_src, sents_tar):
seq_src = map(lambda x:vocab_src.get(x, unk_key), filter_text(sent_src).split())
seq_tar = map(lambda x:vocab_tar.get(x, unk_key), sent_tar.split())
#pdb.set_trace()
yield seq_src, seq_tar
#vs, vt, ss, st = preprocess_text('../data/training.hi-en.en', '../data/training.hi-en.hi', 5000)
#for x,y in text2seq_generator(vs, vt, ss, st):
#print(y)
preprocessing.py 文件:
from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequences
import codecs
import pdb
import numpy as np
from utils import preprocess_text,text2seq_generator
错误:
from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequences
import codecs
import pdb
import numpy as np
from utils import preprocess_text
Traceback (most recent call last):
File "<ipython-input-8-335a30ab7871>", line 6, in <module>
from utils import preprocess_text
ImportError: cannot import name 'preprocess_text'
警告:
redefinition of unused preprocess_text from line 19
选项 1
您从 python IDE 运行 它(而不是从命令行 运行 宁它)。然后 IDE(至少对于 spyder 是这样)将在 path
环境变量中查找 utils.py
脚本。最有可能不存在。
解决方案 1
在脚本开头添加这些行:
import sys
sys.path.insert(0, 'directory_of_utils.py_script')
from utils import preprocess_text, text2seq_generator
或者只是更改您的工作目录:
import os
os.chdir('directory_of_utils.py_script')
from utils import preprocess_text, text2seq_generator
选项 2
您已经安装了模块 utils
。因此,脚本将尝试在该模块中找到函数 preprocess_text
(顺便说一句:如果您通过命令行 运行 就不会发生这种情况)。
解决方案 2
重命名 utils.py
(如果 运行ning 来自 IDE 添加解决方案 1 中的行!)。
您的 PYTHONPATH
中某处似乎有另一个名为 utils
的包,它与您当前的文件冲突。
您可以使用 importlib
模块从其路径显式加载模块。
将这些行添加到 preprocessing.py
(python 3.3 和 3.4):
from importlib.machinery import SourceFileLoader
utils = SourceFileLoader("utils", "/path/to/utils.py").load_module()
utils.preprocess_text(...)
对于python3.5+,你应该使用:
import importlib.util
spec = importlib.util.spec_from_file_location("utils", "/path/to/utils.py")
utils = importlib.util.module_from_spec(spec)
spec.loader.exec_module(utils)
utils.preprocess_text(...)