2012-05-05 62 views
4

我一直在寻找答案的网站,现在相当长的一段时间,但这是给我真的头疼:执行Python程序

我使用Ubuntu 12.04和我要执行从终端Python脚本,而不使用完整路径。 所以我加的/ home/kyril /蟒蛇/脚本/到PATH变量通过把以下内容./bashrc:

kyrilpathvariable="/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/kyril/Python/scripts/:/home/kyril/Bash/scripts" 

if [ "$kyrilpathvariable" = "$PATH" ]; then 
    echo PATH already exported 

else 

PATH=$PATH:/home/kyril/Python/scripts/ 
PATH=$PATH:/home/kyril/Bash/scripts/ 
export PATH 

fi 

(我知道,如果条款是没有必要的,但我不喜欢什么都有)

现在的问题是:这完全适用于我的Bash脚本,所以通过chmod使它们可执行后,我可以只键入$ script.sh并执行它。但是,如果我键入$ python3 script.py引发以下错误:python3: can't open file 'script.py': [Errno 2] No such file or directory

,如果我在的完整路径,它的工作原理脚本类型。任何人有一个想法,我在做什么错了?我必须将目录添加到PYTHONPATH吗? (据我所知,这只有帮助导入模块)。

谢谢你们!

+1

为什么你要script.py的''运行python3 script.py'代替'? – robert

回答

5

当直接调用python3时,python会运行您告诉它的脚本文件,而不使用$PATH来查找它。 PYTHONPATH是无关紧要的 - 用于搜索Python模块。

我猜你在遇到自行运行script.py时调用了错误解释器的问题。我不知道你的脚本的第一行是什么,但它应该是这样的:

#!/usr/bin/env python3 

或者,如果你需要更精细的控制:

#!/usr/bin/env python3.2 

而对于Python的2个脚本:

#!/usr/bin/env python2 

或者:

#!/usr/bin/env python2.7 

在尝试使用它们之前,应该检查系统上是否存在这些可执行文件。

+0

谢谢!我有#!/ usr/bin/python3,所以这解决了我的问题! – YumTum

0

我猜想当python搜索输入文件时会忽略路径变量。 Python开始在当前目录中搜索'script.py',但不知道为该文件声明了一个路径变量,因此找不到它。

不幸的是我不确定如何解决它,但也许有人更有经验的变量可以启发我们?

0
python3 $(type -P script.py) 

告诉Bash在PATH查找可执行文件,并提供其位置和名称。

例如:

$ type -P script.py 
/usr/local/bin/script.py 
0

为了避免道路重复条目,你可以这样做:

for dir in Python Bash; do 
    dir_to_add="$HOME/$dir/scripts" 
    case ":$PATH:" in 
    *:"$dir_to_add":*) ;; # path already contains dir, do nothing 
    *) PATH+=":$dir_to_add" ;; 
    esac 
done 
+0

谢谢!这比我做的更优雅一点:) – YumTum