Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“如何修复”;ImportError:没有名为“”的模块;Python中的错误?_Python - Fatal编程技术网

“如何修复”;ImportError:没有名为“”的模块;Python中的错误?

“如何修复”;ImportError:没有名为“”的模块;Python中的错误?,python,Python,修复此错误的正确方法是什么 我有以下目录结构: /home/bodacydo /home/bodacydo/work /home/bodacydo/work/project /home/bodacydo/work/project/programs /home/bodacydo/work/project/foo 我在目录里 /home/bodacydo/work/project 现在如果我打字 python ./programs/my_python_program.py 我马上就明白了 Im

修复此错误的正确方法是什么

我有以下目录结构:

/home/bodacydo
/home/bodacydo/work
/home/bodacydo/work/project
/home/bodacydo/work/project/programs
/home/bodacydo/work/project/foo
我在目录里

/home/bodacydo/work/project
现在如果我打字

python ./programs/my_python_program.py
我马上就明白了

ImportError: No module named foo.tasks
/programs/my\u python\u program.py
包含以下行:

from foo.tasks import my_function
我不明白为什么python找不到
/foo/tasks.py
——它就在那里

如果我从Python shell中执行此操作,那么它可以工作:

python
>>> from foo.tasks import my_function

只有通过
python./programs/my_python\u program.py
script调用它时,它才起作用。

python不会将当前目录添加到
sys.path
,而是脚本所在的目录。将
/home/bodacydo/work/project
添加到
sys.path
$PYTHONPATH

在foo目录中是否有名为
\uuu init\uuuuuuuuuuuuuuuuuuupy
的文件?如果不是,python就不会将foo识别为python包


参见Python教程中的更多信息。

在我的脑海中,我必须考虑<代码> Foo文件夹是一个独立的库。我可能想考虑将它移到Python安装中的 LIB站点包文件夹。我可能想考虑在那里添加一个<代码> fo.pth文件。

我知道它是一个库,因为
/programs/my_python\u program.py
包含以下行:

from foo.tasks import my_function
从foo.tasks导入my_函数

因此,
/programs
/foo
的同级文件夹并不重要。事实上,
my_python_program.py
是作为如下脚本运行的:

python./programs/my_python\u program.py


以下是一个逐步解决方案:

  • /home/bodacydo/work/project
    中添加一个名为
    run.py
    的脚本,并按如下方式编辑它:

    (将
    main()
    替换为
    mypython\u程序中的等效方法

  • 转到
    /home/bodacydo/work/project
  • 运行
    Run.py
  • 说明:
    由于python会将运行脚本的路径附加到PYTHONPATH,因此运行
    run.py
    将附加
    /home/bodacydo/work/project
    。瞧,
    import foo.tasks将被找到。

    将库添加到PYTHONPATH的示例解决方案

  • 将以下行添加到~/.bashrc中或直接运行它:

    export PYTHONPATH="$PYTHONPATH:$HOME/.python"
    
  • 然后将所需库链接到~/.python文件夹中,例如

    ln -s /home/user/work/project/foo ~/.python/
    
  • 比设置
    PYTHONPATH
    更好的修复方法是使用
    python-m module.path

    这将正确设置
    sys.path[0]
    ,是执行模块的更可靠的方法


    我对这个问题有一些看法,正如其他回答者提到的,原因是
    PYTHONPATH/to/file.py
    path/to
    放在
    PYTHONPATH
    sys.path
    )的开头。如果在使用安装版本时出现此问题,则在使用
    setup.py
    时,确保您的模块包含在
    软件包中

    setup(name='Your program',
        version='0.7.0',
        description='Your desccription',
        packages=['foo', 'foo.bar'], # add `foo.bar` here
    

    谢谢,是的,我有
    \uuu init\uuu.py
    。这次的问题是
    $PYTHONPATH
    。Ignacio的解决方案奏效了。init.py文件是Python将目录视为包含包所必需的;这样做是为了防止具有公共名称(如字符串)的目录无意中隐藏稍后在模块搜索路径上出现的有效模块。在最简单的情况下,init.py可以是一个空文件谢谢你给我留了时间。那么在根文件夹中放init.py有什么意义呢?如果您编辑sys.path或pythonpath,它似乎没有任何用处。@Editor:
    \uuuu init\uuuu.py
    仅表示当目录的父目录位于
    sys.path
    或目录本身是一个包时,该目录应被视为一个包。此外,请检查对该文件夹的权限。在我的例子中,这就是问题所在。要将当前目录添加到python路径,请使用
    export PYTHONPATH=`pwd`
    对我有效的方法是将项目的父目录添加到$PYTHONPATH,在您的例子中是:
    /home/bodacydo/work
    。。。