<p>我的假设是,您<code>hdfs</code>所在的位置被添加到像<code>.profile</code>这样的文件中的<code>PATH</code>中,该文件不会通过cron运行</p>
<p>您可以在脚本开始时手动添加它,或者使用到<code>hdfs</code>的绝对路径。您可以运行<code>which hdfs</code>来查找绝对路径</p>
<hr/>
<p>让我们假设,<code>hdfs</code>位于<code>/usr/local/hadoop/hadoop-2.7.0/bin</code>。在本例中,<code>which hdfs</code>将显示<code>/usr/local/hadoop/hadoop-2.7.0/bin/hdfs</code>。(如果路径不同,请根据<code>which hdfs</code>的输出更改以下对路径的所有引用。)</p>
<p>现在,您可以在脚本的开头添加此内容</p>
<pre class="lang-py prettyprint-override"><code>import os
os.environ['PATH'] += ':/usr/local/hadoop/hadoop-2.7.0/bin'
</code></pre>
<p>…或在脚本中使用<code>hdfs</code>的绝对路径</p>
<pre class="lang-py prettyprint-override"><code>os.system('/usr/local/hadoop/hadoop-2.7.0/bin/hdfs dfs -mkdir /user/hadoop/tmp-archive')
</code></pre>
<p>…或者,如果希望避免在python脚本内部硬编码路径,可以将路径作为命令行参数或环境变量传入(因此可以在crontab文件中进行设置),或者创建一个bash脚本,设置正确的<code>PATH</code>,然后调用python脚本,从cron中调用bash脚本</p>
<p>不幸的是,在crontab文件中的脚本调用中只在前面加上<code>PATH=$PATH:/usr/local/hadoop/hadoop-2.7.0/bin</code>是不起作用的,因为cron不会展开赋值右侧的变量。但另一种解决方法是使用类似<code>sh -c 'PATH=$PATH:/usr/local/hadoop/hadoop-2.7.0/bin python /path/to/my/script.py'</code>的命令</p>