从单独的文件夹导入Python脚本的正确方法

时间:2017-12-11 01:10:25

标签: python terminal pycharm virtualenv

所以我一直在摆弄,并且已经用Python做了一些认真的工作已经有一段时间了。虽然,我偶尔也会遇到一些问题。

在使用Python时,我发现使用PyCharm CE时最舒服。典型的情况是我只是创建一个新的virtualenv,启动PyCharm并在那里打开我的virtualenv。从那以后,它就像自动驾驶一样,PyCharm处理与site-packages和Python运行时使用相关的所有脏工作。

我总是希望保持我的virtualenv干净整洁,所以我经常发现自己在语义上将源代码组织到子模块/子文件夹中。所以每当我想要导入一些代码,类或其他文件夹中的任何东西时,我只需导入它。

想象一下,我virtualenv中有以下结构:

├── bin
├── include    
├── lib           
└── src
    ├── foo.py 
├── important_scripts
    ├── some_script.py
    └── some_other_script.py
└── pip-selfcheck.json

现在,foo.py中的某个地方,我想使用A()中实现的名为some_script.py的函数。显而易见的方法是向foo.py添加一个简单的行 - 类似于from some_script import A。当我从PyCharm运行并调试我的代码(在这种情况下为foo.py)时,这样做非常有效。

与我上面描述的典型场景相反,我想从Terminal.app做同样的事情。所以我将终端cd启动到我的virtualenv并激活它。然后,我所做的是,使用我binvirtualenv文件夹下的Python可执行文件,我尝试运行foo.py(至少这是我认为相当于右键单击并从PyCharm窗口运行foo.py。不幸的是,我收到错误ModuleNotFoundError: No module named 'some_script'

我想我错过了一个简单的细节或其他东西。因为就像我说的那样,从PyCharm运行时它就像魔法一样。

无论如何,任何建议或帮助都将受到高度赞赏。提前谢谢。

1 个答案:

答案 0 :(得分:0)

感谢所有回复和对可能解决方案的参考。在线研究时,我遇到了各种各样的实例,这些实例在导入模块和软件包时或多或少存在相同的问题。所以,这就是我刚刚解决它的方法:

  • important_scripts目录下,我添加了一个名为__init__.py的文件。这基本上只是告诉Python解释器这确实是一个Python包,而不是一个普通的子目录。
  • 在此__init__.py中,我添加了

    from important_scripts.some_script import A 
    
  • 然后在脚本中,我将从中导入函数A,即foo.py我包含以下几行:

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

    基本上将virtualenv附加到site-packages