Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.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
将Python搜索路径扩展到其他源_Python_Search_Import_Path - Fatal编程技术网

将Python搜索路径扩展到其他源

将Python搜索路径扩展到其他源,python,search,import,path,Python,Search,Import,Path,我刚刚加入了一个现有代码库相当大的项目。我们在linux中开发,不使用和IDE。我们通过命令行运行。我试图弄清楚如何让python在运行项目模块时搜索正确的路径。例如,当我运行以下操作时: python someprojectfile.py 我明白了 我所有的导入都会得到这个,我认为这是路径问题 如何让Python在导入语句期间搜索~/codez/project/以及*.py文件的所有文件和文件夹?有几种可能的方法: 将环境变量PYTHONPATH设置为以冒号分隔的目录列表,以搜索导入的模块

我刚刚加入了一个现有代码库相当大的项目。我们在linux中开发,不使用和IDE。我们通过命令行运行。我试图弄清楚如何让python在运行项目模块时搜索正确的路径。例如,当我运行以下操作时:

python someprojectfile.py
我明白了

我所有的导入都会得到这个,我认为这是路径问题


如何让Python在导入语句期间搜索
~/codez/project/
以及
*.py
文件的所有文件和文件夹?

有几种可能的方法:

  • 将环境变量
    PYTHONPATH
    设置为以冒号分隔的目录列表,以搜索导入的模块
  • 在程序中,使用
    sys.path.append('/path/to/search')
    添加希望Python搜索导入模块的目录名。只是Python每次被要求导入模块时搜索的目录列表,您可以根据需要修改它(尽管我不建议删除任何标准目录!)。当Python启动时,您在环境变量
    PYTHONPATH
    中放置的任何目录都将插入到
    sys.path
  • 用于将目录添加到
    sys.path
    。这与普通追加的区别在于,当您使用
    addsitedir
    时,它还会在该目录中查找
    .pth
    文件,并使用它们根据文件的内容向
    sys.path
    添加其他目录。有关更多详细信息,请参阅文档
您想使用哪一种取决于您的情况。请记住,当您将项目分发给其他用户时,他们通常会以Python导入程序自动检测Python代码文件的方式安装项目(即包通常安装在
站点包
目录中),因此如果您在代码中弄乱了
sys.path
,当代码在另一台计算机上运行时,这可能是不必要的,甚至可能产生不利影响。对于开发,我大胆猜测设置
PYTHONPATH
通常是最好的方法

然而,当您使用的是只在您自己的计算机上运行的东西时(或者当您有非标准设置时,例如有时在web应用程序框架中),执行以下操作并非完全不常见

import sys
from os.path import dirname
sys.path.append(dirname(__file__))

您还应该在此处阅读python包:

从您的示例中,我猜您在
~/codez/project
上确实有一个包。python目录中的文件
\uuuu init\uuuu.py
将目录映射到命名空间中。如果您的子目录都有一个
\uuuu init\uuuu.py
文件,那么您只需要将基本目录添加到
PYTHONPATH
。例如:

PYTHONPATH=$PYTHONPATH:$HOME/adaifotis/project

正如David所解释的,除了测试PYTHONPATH环境变量外,还可以在python中进行如下测试:

$ python
>>> import project                      # should work if PYTHONPATH set
>>> import sys
>>> for line in sys.path: print line    # print current python path
C:\Users\example\...\example

我读这个问题是为了寻找答案,但我不喜欢其中任何一个

所以我写了一个快速而肮脏的解决方案。只要把它放在sys.path的某个地方,它就会在
文件夹下(从当前工作目录)或
abspath下添加任何目录:

#using.py

import sys, os.path

def all_from(folder='', abspath=None):
    """add all dirs under `folder` to sys.path if any .py files are found.
    Use an abspath if you'd rather do it that way.

    Uses the current working directory as the location of using.py. 
    Keep in mind that os.walk goes *all the way* down the directory tree.
    With that, try not to use this on something too close to '/'

    """
    add = set(sys.path)
    if abspath is None:
        cwd = os.path.abspath(os.path.curdir)
        abspath = os.path.join(cwd, folder)
    for root, dirs, files in os.walk(abspath):
        for f in files:
            if f[-3:] in '.py':
                add.add(root)
                break
    for i in add: sys.path.append(i)

>>> import using, sys, pprint
>>> using.all_from('py') #if in ~, /home/user/py/
>>> pprint.pprint(sys.path)
[
#that was easy
]

我喜欢它,因为我可以为一些随机工具创建一个文件夹,而不是让它们成为包或任何东西的一部分,并且仍然可以通过几行代码访问其中的一些(或全部)。

我找到的最简单的方法是创建一个文件
任意名称.pth
并将其放入文件夹
\Lib\site packages
。您应该在安装python的任何位置都可以找到该文件夹

在该文件中,放置一个目录列表,在其中保存要导入的模块。例如,在该文件中创建一行,如下所示:

$ python
>>> import project                      # should work if PYTHONPATH set
>>> import sys
>>> for line in sys.path: print line    # print current python path
C:\Users\example\...\example
您可以通过在python中运行以下命令来判断它是否有效:

import sys
for line in sys.path:
    print line
您将看到您的目录打印出来,以及其他您也可以从中导入的目录。现在,您可以导入位于该目录中的
mymodule.py
文件,该文件与以下文件一样简单:

import mymodule

这将不会导入子文件夹。为此,您可以想象创建一个python脚本来创建一个
.pth
文件,其中包含您定义的文件夹的所有子文件夹。可能在启动时运行它。

我知道这个线程有点旧,但我花了一些时间才了解它的核心,所以我想与大家分享

在我的项目中,我将主脚本放在父目录中,为了区分模块,我将所有支持模块放在名为“模块”的子文件夹中。在我的主脚本中,我像这样导入这些模块(对于名为report.py的模块):

如果我调用我的主脚本,这就行了。但是,我想通过在每个模块中包含
main()
并直接调用每个模块来测试每个模块,如下所示:

python modules/report.py
现在Python抱怨它找不到“名为modules的模块”。这里的关键是,默认情况下,Python在其搜索路径中包括脚本的文件夹,但不包括CWD。所以这个错误实际上是说“我找不到模块子文件夹”。这是因为report.py模块所在的目录中没有“modules”子目录

我发现最简单的解决方案是在Python搜索路径中附加CWD,方法是在顶部包含以下内容:

import sys

sys.path.append(".")
现在Python搜索CWD(当前目录),找到“modules”子文件夹,一切正常。

旧问题的新选项。
在Debian上安装
fail2ban
程序包,看起来它是硬编码的,安装在
/usr/lib/python3/dist-packages/fail2ban
路径不在python3
sys.path


>蟒蛇3
Python 3.7.3(v3.7.3:ef4ec6ed12,2019年6月25日,18:51:50)
[GCC 6.3.0 20170516]在linux上
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>导入系统
>>>系统路径
['',/usr/lib/python37.zip',/usr/lib/python3.7','/usr/lib/python3.7/lib dynload','/usr/lib/p