Python 同名模块的两个实现导入问题
我使用两个构建在caffe之上的库:crf-rnn()和hed(),前者用于语义图像分割,后者用于轮廓检测。最后,我意识到如何让它们一起工作来进行目标跟踪,但现在我面临一个尴尬的问题:由于两者都是在caffe之上构建的,所以它们导入相同的包,但每个包的内容都非常不同,即crf rnn使用caffe。hed没有的分段器和ed使用caffe。crf rnn没有的测试 Python不允许导入两个同名的包。我试图找到一种解决方法,将hed放在一个单独的Python文件中,并在主脚本中导入它,然后对其中一个包使用Python 同名模块的两个实现导入问题,python,import,package,caffe,Python,Import,Package,Caffe,我使用两个构建在caffe之上的库:crf-rnn()和hed(),前者用于语义图像分割,后者用于轮廓检测。最后,我意识到如何让它们一起工作来进行目标跟踪,但现在我面临一个尴尬的问题:由于两者都是在caffe之上构建的,所以它们导入相同的包,但每个包的内容都非常不同,即crf rnn使用caffe。hed没有的分段器和ed使用caffe。crf rnn没有的测试 Python不允许导入两个同名的包。我试图找到一种解决方法,将hed放在一个单独的Python文件中,并在主脚本中导入它,然后对其中一
as
到import caffe as cf
,但到目前为止没有任何效果
有什么建议吗
编辑:这是一个名为Aux.py
def import_hed_caffe():
import sys,os
caffe_dir = '/home/alex/Downloads/hed/python'
sys.path.insert(0,caffe_dir)
hed_model = 'deploy.prototxt'
hed_pretrained = 'hed_pretrained_bsds.caffemodel'
import caffe as cf
net = cf.Net(hed_model, hed_pretrained, cf.TEST)
return net
这是主脚本:
caffe_root = '../caffe-crfrnn/'
sys.path.insert(0, caffe_root + 'python')
import caffe as espresso
import AuxScript
net = espresso.Segmenter(MODEL_FILE, PRETRAINED, gpu=False)
a=AuxScript.import_hed_caffe()
我得到
AttributeError: 'module' object has no attribute 'TEST'
不用说,分开来看,一切都很好,所以它只是一个进口
编辑2:
/CMAKE文件
./cmakfiles/pycaffe.dir
./cmakfiles/pycaffe.dir/caffe
/咖啡馆
./caffe/imagenet
/caffe/proto
/咖啡/测试
编辑3:
├── caffe
│ ├── _caffe.cpp
│ ├── _caffe.so -> /home/alex/Downloads/hed/lib/_caffe.so
│ ├── classifier.py
│ ├── classifier.pyc
│ ├── detector.py
│ ├── detector.pyc
│ ├── draw.py
│ ├── imagenet
│ │ └── ilsvrc_2012_mean.npy
│ ├── __init__.py
│ ├── __init__.pyc
│ ├── io.py
│ ├── io.pyc
│ ├── net_spec.py
│ ├── net_spec.pyc
│ ├── proto
│ │ ├── caffe_pb2.py
│ │ └── __init__.py
│ ├── pycaffe.py
│ ├── pycaffe.pyc
│ └── test
│ ├── test_layer_type_list.py
│ ├── test_net.py
│ ├── test_net_spec.py
│ ├── test_python_layer.py
│ ├── test_python_layer_with_param_str.py
│ └── test_solver.py
├── classify.py
├── CMakeFiles
│ ├── CMakeDirectoryInformation.cmake
│ ├── progress.marks
│ └── pycaffe.dir
│ ├── build.make
│ ├── caffe
│ │ └── _caffe.cpp.o
│ ├── cmake_clean.cmake
│ ├── CXX.includecache
│ ├── DependInfo.cmake
│ ├── depend.internal
│ ├── depend.make
│ ├── flags.make
│ ├── link.txt
│ └── progress.make
├── cmake_install.cmake
├── CMakeLists.txt
├── detect.py
├── draw_net.py
├── Makefile
├── requirements.txt
我看到了您上次的编辑,我必须说更改/篡改python
sys.path
在您的上下文中是必要的,但这还不够:您必须重命名一个caffe
包
例如:如果caffe
包是一个名为caffe
的目录,其中包含一个\uuuu init\uuuuuuuuuy.py
文件,请将caffe
重命名为espresso
,并在代码中简单地:
import espresso
(如果它只是一个caffe.py
文件,请重命名为espresso.py
,尽管如果同一目录中有其他模块,问题可能更大,值得一试)
顺便说一句:导入模块时,比如说,xxx
,您可以通过键入以下内容来知道它使用的是哪个完整文件路径:
print(xxx.__file__)
(有疑问时有用)好的,所以我找到了最不复杂的解决方案:我编写了两个脚本,一个用于crf rnn,生成我在完整数据集上运行一次的blob并存储输出
然后我编写了第二个脚本,使用hed edge detector,我每次检测和跟踪对象时都会使用它。你的意思是你试图重命名一个caffe包,但它不起作用?是的,即使我更改pythonpath中的路径,并重新导入caffe,我得到的包仍然是具有上一个包路径的包。如果我为crf rnn导入,然后为hed导入,这就是发生的情况更改路径不会剪切它,但重命名应该可以工作。你能发布代码片段吗?并描述两个
caffe
文件树?除了插入路径外,还必须重命名其中一个caffe.py
文件。导入后,导入另一个同名模块不会有任何作用。您同意不可能在pythonpath中创建一个文件caffe_1.py
,并且您没有弄错(除非您忘记了下划线)?你能描述一下你的目录结构吗?我添加了一个目录结构。我很惊讶这不是一个非常广为人知的问题,因为在caffeI之上有很多构建,这些都是目录名。因此,您可以将caffe
目录重命名为espresso
,您将能够在相同的上下文中导入espresso和caffe。把它们视为不同的产品。