为什么我的Python没有将当前工作目录添加到路径中?

50

我经常看到一些网站提到,在执行 'python' 命令的目录会被添加到 Python 路径中。例如在 http://www.stereoplex.com/blog/understanding-imports-and-pythonpath 上,作者进入 /tmp 文件夹然后运行 'print(sys.path)',发现 /tmp 文件夹出现在路径列表中。这是我在我的系统上尝试此操作(使用安装了 2.6.6 版本的 Python):

示例结构:

app/
  mymodule.py
  inner_folder/
    myscript.py

我的脚本文件myscript.py中包含以下代码行:

import mymodule.py

我的做法:

cd app
python inner_folder/myscript.py # ImportError

由于我正在从app/目录执行解释器,难道不应该将'app'添加到Python路径中吗?这是我阅读的许多文档指定的行为方式。

请解惑!

(我已经通过手动将所需文件夹添加到环境中临时解决了此问题,但不想永远依赖它。由于许多网站都说可以这样做,我想自己尝试一下)


8
你的意思是:应该使用import mymodule而不是import 'mymodule.py' - mouad
4个回答

79

添加的是脚本所在的目录,而不是当前目录。如果你将inner_folder/转换为一个包,那么可以使用python -m inner_folder.myscript来运行脚本,并将app/添加到sys.path


+1:确实,即使导入已经修复,这才是真正的解决方案。 - André Caron
4
谢谢您的澄清。我知道脚本目录已经添加,但我之所以认为“当前目录”也被添加是因为它曾经起作用。我发誓!一定有什么事情发生导致它停止工作。我不记得以任何方式修改过PYTHONPATH,这就是我问这个问题的原因。 - trinth
1
在mac OS 10.7.5中运行Python 2.7时,当前目录会被添加,原始示例代码可以正常工作。 - Cypress Frankenfeld
@CypressFrankenfeld,不确定为什么你的当前目录被添加了,但是为了保险起见,你可能需要先执行 unset PYTHONPATH - Garrett
8
在 Python 3.4 之前的版本中,设置空的 PYTHONPATH 会导致将 "." 添加到 sys.path 中。详见 https://docs.python.org/3/whatsnew/3.4.html#changes-in-python-command-behavior。 - ForeverWintr

4

无论当前目录是否在sys.path中,导入语句通常如下所示:

import mymodule

您编写的代码如下所示:
import 'mymodule.py'

0

检查模块目录不为空。这听起来很愚蠢,但在我的情况下,我没有意识到它是一个git子模块,并且没有递归克隆。


0
在我的经验中,最干净的解决方案是添加一个像这样结构的setup.py
app/
  __init__.py
  mymodule.py
  inner_folder/
    myscript.py
setup.py

setup.py 的内容看起来像这样:

from setuptools import setup

setup(
    name='my-app',
    version='0.1',
    packages=['app'],
    install_requires=[
          # a list of required packages if needed
      ],
)

通过 python setup.py develop 安装后,在 myscript.py 中,您可以像这样导入 mymodule:

import app.mymodule

或者如果你想要执行 import mymodule,你可以将 setup.py 移动到 app/ 目录下,和 mymodule.py 放在同一个目录下,并将 packages=['app'] 改为 packages=[]


请注意,对于新项目,建议使用pyproject.toml(或setup.cfg)而不是setup.py。请参考此处的说明:https://setuptools.pypa.io/en/latest/userguide/quickstart.html#setup-py - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接