Python代码在shell中工作正常,但在文件中调用时不能

Posted

技术标签:

【中文标题】Python代码在shell中工作正常,但在文件中调用时不能【英文标题】:Python code working fine in shell but not when invoked in a file 【发布时间】:2020-05-05 10:21:22 【问题描述】:

我在终端外壳上运行以下代码:

>>> import Strat
>>> x=Strat.Try()
>>> x.do_something()
You can do anything here!!!(this is the output of do_something)

但同一个文件在文件中调用时不起作用:

import Strat
class Strategy:
    def gen_fibonacci(self,ind,n):
        x=Strat.Try()
        x.do_something()

        l=[]
        num = 3
        t1 = 0 
        t2 = 1
        nextTerm = 0
        i=1
        if ind==1:
            l.append(0)
            l.append(1)
            i=3
        if ind==2:
            l.append(1)
            i=2
        while i<n:
            nextTerm=t1+t2
            t1=t2
            t2=nextTerm
            if num>=ind:
                i=i+1
                l.append(nextTerm)
            num=num+1
        return l

代码给出以下错误:

Traceback (most recent call last):
  File "./python_plugins/strat1.py", line 8, in gen_fibonacci
    x=Strat.Try()
AttributeError: module 'Strat' has no attribute 'Try'

注意:这里的 Strat 是一个共享库(so 文件),类尝试使用成员函数 do_something()

strat.so 文件是 :

的编译版本
namespace python = boost::python;
class Strat

    public:
    virtual std::vector<long long> gen_fibonacci(int in,int n)= 0;
;

struct Try

    void do_something() 
     
        std::cout<<"You can do anything here!!!"<<"\n";
    
;

class PyStrat final
    : public Strat
    , public bp::wrapper<Strat>

    std::vector<long long> gen_fibonacci(int in,int n) override
    
        get_override("gen_fibonacci")();
    

;


BOOST_PYTHON_MODULE(Strat)

    bp::class_<Try>("Try")
        .def("do_something", &Try::do_something)
        ;

    bp::class_<std::vector<long long> >("Long_vec")
        .def(bp::vector_indexing_suite<std::vector<long> >())
    ;


    bp::class_<PyStrat, boost::noncopyable>("Strat")
        .def("gen_fibonacci", &Strat::gen_fibonacci)
        ;

编译使用的命令:

g++ -I /usr/include/python3.6 -fpic -c -o Strat.o strat_helper.cpp
g++ -o Strat.so -shared Strat.o -L/usr/lib/x86_64-linux-gnu -lboost_python3-py36 -lpython3.6m

我正在使用 boost python。

【问题讨论】:

您的代码中是否还有其他文件名Strat.py @ThierryLathuille 不,只有一个目标文件strat.o,我不认为这是一个问题,因为覆盖gen_fibonacci 函数发生得很好,此外,如果我删除这两行代码可以工作很好 检查两种情况下导入的文件:import Strat; print(Strat.__file__) 我检查了两个导入相同的文件:Strat.so 和来自同一个目录? 【参考方案1】:

我看到您正在尝试导入 C++ 函数。 我希望你通过Framework on Using Boost 并阅读以下链接,这可能会帮助您解决您的问题,Extending Python with C or C++ SWIG 是另一个可能有帮助的链接SWIG

这也会很有帮助。 Calling C/C++ from Python?

【讨论】:

感谢您的回复,但不,它对我不起作用。 ImportError: cannot import name 'Try'这个弹出 @DeepanshNagaria 我刚刚编辑了代码,请您运行代码并分享输出。所以我可以更好地帮助你。如果您也可以共享 Strat 文件代码,那就太好了,所以我看看它有什么类和功能 我已经分享了你要求的代码,你建议的代码给出了编译错误:ImportError: cannot import name 'Try' @DeepanshNagaria 之前的印象是你试图导入另一个 python 文件,在你添加了更多细节之后,很明显你试图从 C++ 调用一个函数,我做了一些研究并分享了一些可能对您的分析有帮助的链接,虽然我想帮助你,但我的回答却被否决了。 :) 感谢您的链接,但实际上我知道它们,我正在使用 boost:python,这是文档中规定的方式,但不知何故它在 shell 中有效,但在代码中无效。很高兴,但我不是反对者

以上是关于Python代码在shell中工作正常,但在文件中调用时不能的主要内容,如果未能解决你的问题,请参考以下文章

ForEach 不能在 mongodb 上工作,但在本地数组声明中工作正常

为啥 Thymeleaf 代码在 HTML 的 head 部分不起作用但在 body 中工作正常

无法导入模块:在工作文件中找不到模块,但在另一个文件中工作正常

在 WAMP 中工作正常,但在 XAMPP 中不起作用

意外的响应代码 403(但在浏览器中工作正常)

从 Python 调用外部命令失败并返回代码 0xC0000005 但在控制台中工作