Python 导入驻留在不相关路径中的文件

Python 导入驻留在不相关路径中的文件,python,Python,假设我有一个名为root的目录,它有两个目录:x和y。我有一个驻留在x中的模块文件,我们称之为test.py。现在在y中,我有一个模块需要调用test.py 我正在做一个简单的: 来自x导入测试 它是有效的。我在想,这是怎么回事 编辑:它是如何工作的,因为在x中没有\uuu init\uuuuuuuy.py文件,但是从y我可以从那里调用一个模块。因为有一个到它的路径。试试这个: import sys print sys.path 它应该输出python用作解析模块位置的起始目录的所有位置。因此

假设我有一个名为
root
的目录,它有两个目录:
x
y
。我有一个驻留在
x
中的模块文件,我们称之为
test.py
。现在在
y
中,我有一个模块需要调用
test.py

我正在做一个简单的:

来自x导入测试

它是有效的。我在想,这是怎么回事


编辑:它是如何工作的,因为在
x
中没有
\uuu init\uuuuuuuy.py
文件,但是从
y
我可以从那里调用一个模块。

因为有一个到它的路径。试试这个:

import sys
print sys.path
它应该输出python用作解析模块位置的起始目录的所有位置。因此,例如,如果
root
实际上位于/home/pallfruption/root(或windows上的C:\Documents and Settings\pallfruption\My Documents\root),您将看到如下内容:

['', '/usr/local/lib/python2.6/dist-packages', *more stuff*, '/home/PulpFiction/root']
或在windows上:

['', 'C:\\python26\\site-packages', *more stuff here*, 'C:\Documents and Settings\PulpFiction\My Documents\root']
有几种方法可以设置系统路径(据我所知):

  • 从中运行脚本的目录
  • 环境变量(确切地说是PYTHONPATH)
  • Windows注册表(仅在Windows上)
  • 在代码中手动将路径附加到sys.path变量
  • 我猜它对您有效的原因是您在
    root
    (比如
    main.py
    )中有一个脚本,并且该脚本最终从
    x
    y
    导入。由于您在根目录中运行脚本,因此它被添加到python路径中,从而允许
    from x import test
    工作

    编辑


    没有
    \uuuu init\uuuu.py
    嗯?你确定那里没有
    \uuuu init\uuuu.pyc
    (注意pyc中的C)?

    它没有。您或您的操作系统或Python站点启动脚本已经修改了
    PYTHONPATH

    14:59 jsmith@upsidedown pwd
    /Users/jsmith/Test/Test2/root
    
    14:59 jsmith@upsidedown cat x/test.py
    def hello():
      print "hello"
    
    14:59 jsmith@upsidedown cat y/real.py
    #!/usr/bin/python
    from x import test
    test.hello()
    
    14:59 jsmith@upsidedown y/real.py
    Traceback (most recent call last):
      File "y/real.py", line 3, in <module>
        from x import test
    ImportError: No module named x
    
    14:59jsmith@upsidedown pwd
    /Users/jsmith/Test/Test2/root
    14:59 jsmith@upsidedown cat x/test.py
    def hello():
    打印“你好”
    14:59 jsmith@upsidedown 猫y/real.py
    #!/usr/bin/python
    从x导入测试
    test.hello()
    14:59 jsmith@upsidedown y/real.py
    回溯(最近一次呼叫最后一次):
    文件“y/real.py”,第3行,在
    从x导入测试
    ImportError:没有名为x的模块
    
    我明白了。与我上面提到的情况类似,导入模块的最佳方式是什么?稍后我将检查我的代码,但首先我应该知道这样做的方法:)
    import sys
    ,然后
    sys.path.append(“/full/path/to/root”)
    ,并确保
    root/x
    中有一个
    \uu init\uuuuuuuuuuuuuuuuuuuuuuuuy
    。谢谢,我会尝试一下。谢谢你的解释和时间!编辑:我发现了这一点,因为我的原始脚本是从
    x
    开始的,这就是为什么这样做的原因。