<p>我在运行烧瓶和芹菜的应用程序中遇到了完全相同的问题。我花了太多时间在谷歌上寻找一个简单的答案。唉,没有。在</p>
<p>我不喜欢“python-m”语法,因为对于在运行的代码中调用函数来说,这种语法不太实用。由于我的大脑似乎很小,我无法掌握其他答案。在</p>
<p>所以…有错的路和漫长的路。他们两个都(为我)工作,我相信我会受到社区的猛烈抨击。在</p>
<p><strong>错误的方法</p>
<p>可以使用<code>imp</code>包直接调用模块,如下所示:</p>
<pre><code>import imp
common = imp.load_source('common', os.path.dirname(os.path.abspath('__file__')) + '/common.py')
result = common.stats() #not sure how you call stats, but you hopefully get the idea
</code></pre>
<p>我很快就找到了那些拒绝的推荐信,但是我找不到他们……对不起。在</p>
<p><strong>长途跋涉</strong></p>
<p>此方法涉及到将每个模块临时附加到路径中。这对我的Docker部署很有效,不管容器的目录结构如何,都能很好地工作。步骤如下:</p>
<p>1)必须从<code>__init__</code>文件的父目录导入相关模块。这实际上是<code>__init__</code>的全部要点,它允许其包中的模块是可调用的。因此,在您的例子中,<code>cron/__init__</code>应该包含:</p>
^{pr2}$
<p>看起来你的目录不会比这个更高,但是对于任何其他的包级别,你也会做同样的事情。在</p>
<p>2)现在需要将模块的路径附加到path变量。您可以通过运行以下命令查看其中的内容:</p>
<p><code>sys.path</code></p>
<p>正如预期的那样,您可能不会在其中看到任何模块。这意味着,当您调用<code>common</code>模块时,Python无法确定您想要什么。为了添加路径,您需要找出目录结构。您需要使此动态以适应目录的更改。在</p>
<p>值得注意的是,每次运行模块时都需要运行这个函数。我不确定您的<code>cron</code>模块是什么,但在我的例子中它是芹菜。所以,这只在我启动workers和初始crontab时运行。在</p>
<p>以下是我的破解方法(我相信有更干净的方法来实现):</p>
<pre><code>curr_path = os.getcwd() #current path where cron is running
parrent_path = os.path.abspath(os.path.join(os.getcwd(), '..')) #the parent directory path
parrent_dir = os.path.basename(os.path.abspath(parrent_path)) #the parent directory name
while parrent_dir <> 'project_name': #loop until you get to the top directory - should be the project name
parrent_path = os.path.abspath(os.path.join(par_path, '..'))
parrent_dir = os.path.basename(os.path.abspath(parrent_path))
</code></pre>
<p>在您的例子中,这可能是一个挑战,因为您有两个名为“app”的目录。你的顶级“应用程序”是我的“项目名称”。下一步,假设您已将其更改为“project_name”。在</p>
<p>3)现在可以将每个模块的路径附加到path变量:</p>
<p><code>sys.path.append(parrent_dir + '/app')</code></p>
<p>现在,如果您再次运行<code>sys.path</code>,您应该会在其中看到<code>/app</code>的路径。在</p>
<p>总结:确保所有的<code>__init__</code>都有导入,确定要导入的模块的路径,将路径附加到PATH变量。在</p>
<p>我希望这有帮助。在</p>