1、python脚本中经常第一句出现#!/usr/bin/env python或#!/usr/bin/python。这句话的意义下面解释:

脚本语言的第一行,目的就是指出,你想要你的这个文件中的代码用什么可执行程序去运行它,就这么简单

!/usr/bin/python是告诉操作系统执行这个脚本的时候,调用/usr/bin下的python解释器;

!/usr/bin/env python这种用法是为了防止操作系统用户没有将python装在默认的/usr/bin路径里。当系统看到这一行的时候,首先会到env设置里查找python的安装路径,再调用对应路径下的解释器程序完成操作。

!/usr/bin/python相当于写死了python路径;

!/usr/bin/env python会去环境设置寻找python目录,推荐这种写法

如果你用 python xxoo.py 来运行,那么写不写都没关系,如果要用 ./xxoo.py 那么就必须加这行, 用来为脚本语言指定解释器.

通常认为用 #!/usr/bin/env python 要比 #!/usr/bin/python 更好,因为 python 解释器有时并不安装在默认路径,例如在 virtualenv 中。

当你把py文件直接赋予执行权限去执行 ./yourfile.py 的时候,给文件指定一个解释器。

而 #!/usr/bin/python 是一般默认的python解释器的路径,所以这种的就是装在默认位置的不会出问题。

但是 #!/usr/bin/envpython 则更加通用一些会去你的PATH 中寻找python 。

python脚本的两种调用方式说明:

1、./run.py.shell直接调用python脚本

2、python run.py 调用python 解释器来调用python脚本

先分别解释:

1、./run.py调用脚本的方式。shell把run.py当成一般的脚本看待,不把它当成python脚本。按这种方式调用脚本,python 脚本的第一行必须有:

!/usr/bin/env python3(或#!/usr/bin/env python)

先举例子说明,在说明原因:

未加#!/usr/bin/env python3的情况:

a.py:

print ('a')

说明:要使用./a.py,必须使用chmod将a.py的属性改成可执行的。

chmod 755 a.py

-rwxr-xr-x 1 root root 12 Nov 27 09:43 a.py

如果a.py是不可执行的,那么./a.py就会报如下错误。

-bash: ./a.py: Permissiondenied

在将a.py改为可执行后,如果使用./a.py,还是会报错。

./a.py: line 1: syntaxerror near unexpected token `'a''

./a.py: line 1: `print('a')'

但是,因为我系统中装了python2和python3.

所以,使用#!/usr/bin/env python3提示shell使用python3来调用脚本.

a.py内容如下:---------------------------------------------------------------------------------------------------

!/usr/bin/env python3

print ('a')

执行结果为:a

python3 print函数必须要加上().

所以,如果上述的print('a')变为print 'a',显然是会报错的。

root@iZ28yi4s6zwZ:/mnt/DisplayAdvertisingChallenge/Gbdt_Fm_Kaggle#./a.py

File "./a.py", line 2

print 'a'

^

SyntaxError: invalidsyntax

以上就说明了,使用./run.py调用python脚本的方式,取决于你在python脚本中第一句,并且使用./run.py必须在脚本文件中写上#!/usr/bin/env python3(或类似的命令),不然都执行不了。

1、先说明一下,我的系统中是预装了python2,然后我装了python3,并且系统默认的python是python2。我装了python3并没有改变系统默认的python解释器,也不建议把系统默认的python解释器改变了,因为像scikit-learn等库很多还是基于python2.7的,你把系统默认的python改成python3会导致很多库出问题。

2、看一下/usr/bin:就知道在ubuntu中,各种软件的安装情况

lrwxrwxrwx 1 root root 9 Jun 19 2013 python -> python2.7

lrwxrwxrwx 1 root root 9 Jun 19 2013 python2 -> python2.7

-rwxr-xr-x 1 root root 2985296 Dec 19 2014 python2.7

lrwxrwxrwx 1 root root 30 Nov 26 10:08 python3 ->/opt/python3.3.2/bin/python3.3

说明:

1、python-> python2.7:系统默认的python是python2.7

2、python2-> python2.7:python2执行的是python2.7

3、python3-> /opt/python3.3.2/bin/python3.3:python3执行的是/opt/python3.3.2/bin/python3.3

现在做个试验:说明使用./run.py的方式,随着第一句#!/usr/bin/envpython3的不同,shell会调用不同的python解释器。

1、

[python] view plain copy

!/usr/bin/env python3

import subprocess, sys, os, time

NR_THREAD = 1

start = time.time()

cmd = 'converters/pre-a.py trainsample0.25.csv tr.gbdt.dense tr.gbdt.sparse' subprocess.call(cmd, shell=True)

cmd = 'converters/pre-a.py testsample0.25.csv te.gbdt.dense te.gbdt.sparse' subprocess.call(cmd, shell=True)

print ("end pre-a.py")

中断程序查看shell调用哪个python解释器:

File"./run_test.py", line 10, in

subprocess.call(cmd, shell=True)

File "/opt/python3.3.2/lib/python3.3/subprocess.py", line 522, incall

Traceback (most recentcall last):

File "converters/pre-a.py", line36, in

key = field + '-' + row[field]

KeyboardInterrupt

return p.wait(timeout=timeout)

File "/opt/python3.3.2/lib/python3.3/subprocess.py", line 1528,in wait

(pid, sts) = self._try_wait(0)

File "/opt/python3.3.2/lib/python3.3/subprocess.py", line 1485,in _try_wait

(pid, sts) = _eintr_retry_call(os.waitpid,self.pid, wait_flags)

File "/opt/python3.3.2/lib/python3.3/subprocess.py", line 476, in_eintr_retry_call

return func(*args)

KeyboardInterrupt

很明显,使用#!/usr/bin/env python3,那么shell就调用了python3的解释器。

2、

[python] view plain copy

!/usr/bin/env python2

import subprocess, sys, os, time

NR_THREAD = 1

start = time.time()

cmd = 'converters/pre-a.py trainsample0.25.csv tr.gbdt.dense tr.gbdt.sparse' subprocess.call(cmd, shell=True)

cmd = 'converters/pre-a.py testsample0.25.csv te.gbdt.dense te.gbdt.sparse' subprocess.call(cmd, shell=True)

print ("end pre-a.py")

中断程序查看shell调用哪个python解释器:

Traceback (most recentcall last):

File "./run_test.py", line 10, in

subprocess.call(cmd, shell=True)

File "/usr/lib/python2.7/subprocess.py",line 493, in call

return Popen(*popenargs, **kwargs).wait()

File "/usr/lib/python2.7/subprocess.py",line 1291, in wait

pid, sts = _eintr_retry_call(os.waitpid,self.pid, 0)

File "/usr/lib/python2.7/subprocess.py",line 478, in _eintr_retry_call

return func(*args)

KeyboardInterrupt

很明显,使用#!/usr/bin/env python2,那么shell就调用了python2的解释器。

3、

[python] view plain copy

!/usr/bin/env python

import subprocess, sys, os, time

NR_THREAD = 1

start = time.time()

cmd = 'converters/pre-a.py trainsample0.25.csv tr.gbdt.dense tr.gbdt.sparse' subprocess.call(cmd, shell=True)

cmd = 'converters/pre-a.py testsample0.25.csv te.gbdt.dense te.gbdt.sparse' subprocess.call(cmd, shell=True)

print ("endpre-a.py")

中断程序查看shell调用哪个python解释器:

File"./run_test.py", line 10, in

subprocess.call(cmd, shell=True)

File "/usr/lib/python2.7/subprocess.py",line 493, in call

return Popen(*popenargs, **kwargs).wait()

File "/usr/lib/python2.7/subprocess.py",line 1291, in wait

pid, sts = _eintr_retry_call(os.waitpid,self.pid, 0)

File "/usr/lib/python2.7/subprocess.py",line 478, in _eintr_retry_call

return func(*args)

KeyboardInterrupt

root@iZ28yi4s6zwZ:/mnt/DisplayAdvertisingChallenge/Gbdt_Fm_Kaggle#Traceback (most recent call last):

File "converters/pre-a.py", line19, in

for row incsv.DictReader(open(args['csv_path'])):

File "/opt/python3.3.2/lib/python3.3/csv.py", line 118, in__next__

d = dict(zip(self.fieldnames, row))

KeyboardInterrupt

很明显,使用#!/usr/bin/env python,那么shell就调用了系统默认的python解释器,也就是python2。python -> python2.7。那么,为什么还会出现python3.3.2。那是因为程序中,subprocess.call(cmd, shell=True),开了一个子进程,使用了shell来调用pre-a.py,pre-a.py肯定是使用#!/usr/bin/envpython3

.pre-a.py脚本的内容如下:

[python] view plain copy

!/usr/bin/env python3

import argparse, csv, sys

from common import *

if len(sys.argv) == 1:

sys.argv.append('-h')

parser = argparse.ArgumentParser() parser.add_argument('csv_path', type=str) parser.add_argument('dense_path', type=str) parser.add_argument('sparse_path', type=str) args = vars(parser.parse_args())

2、如果使用python run.py 的方式来调用脚本,那么脚本文件中的第一句#!/usr/bin/envpython3就会被自动略掉,不会起到任何的作用。

python2 run.py代表使用默认的python2解释器来调用脚本。

python3 run.py 代表使用默认的python3解释器来调用脚本。

python run.py 代表使用默认的python解释器来调用脚本。

python run_test.py:

^CTraceback (mostrecent call last):

File "run_test.py", line 10, in

subprocess.call(cmd, shell=True)

File "/usr/lib/python2.7/subprocess.py",line 493, in call

return Popen(*popenargs, **kwargs).wait()

File "/usr/lib/python2.7/subprocess.py",line 1291, in wait

pid, sts = _eintr_retry_call(os.waitpid,self.pid, 0)

File "/usr/lib/python2.7/subprocess.py",line 478, in _eintr_retry_call

return func(*args)

KeyboardInterrupt

root@iZ28yi4s6zwZ:/mnt/DisplayAdvertisingChallenge/Gbdt_Fm_Kaggle#Traceback (most recent call last):

File "converters/pre-a.py", line22, in

val = row['I{0}'.format(j)]

KeyboardInterrupt

很明显,python run_test.py,使用默认的python解释器(python2)来调用脚本。

python3 run_test.py:

^CTraceback (mostrecent call last):

File "run_test.py", line 10, in

subprocess.call(cmd, shell=True)

File "/opt/python3.3.2/lib/python3.3/subprocess.py", line 522, in call

return p.wait(timeout=timeout)

File "/opt/python3.3.2/lib/python3.3/subprocess.py", line 1528, in wait

(pid, sts) = self._try_wait(0)

File "/opt/python3.3.2/lib/python3.3/subprocess.py", line 1485, in _try_wait

(pid, sts) = _eintr_retry_call(os.waitpid,self.pid, wait_flags)

File "/opt/python3.3.2/lib/python3.3/subprocess.py", line 476, in _eintr_retry_call

return func(*args)

KeyboardInterrupt

root@iZ28yi4s6zwZ:/mnt/DisplayAdvertisingChallenge/Gbdt_Fm_Kaggle#Traceback (most recent call last):

File "converters/pre-a.py", line19, in

for row incsv.DictReader(open(args['csv_path'])):

File "/opt/python3.3.2/lib/python3.3/csv.py", line 118, in next

d = dict(zip(self.fieldnames, row))

KeyboardInterrupt

python里row是什么意思_row python相关推荐

  1. python里unexpected eof while parsing_使用Python编程时的10个注意事项

    01初始变化量 在Python里,一个表达式中的名字在它被赋值之前是没法使用的.这是有意而为的:这样能避免一些输入失误,同时也能避免默认究竟应该是什么类型的问题(0,None,"" ...

  2. python里load什么意思_【python】json中load和loads区别

    相同点 dump 和 dumps 都实现了序列化 load 和 loads 都实现反序列化 变量从内存中变成可存储或传输的过程称之为序列化 序列化是将对象状态转化为可保存或可传输格式的过程. 变量内容 ...

  3. set在python里是什么意思_set在python里的含义和用法

    set在python里是什么意思? set是一组数,无序,内容又不能重复,通过调用set()方法创建: >>> s = set(['A', 'B', 'C']) 对于访问一个set的 ...

  4. 在python里是什么意思_在Python中$是什么意思?

    相关课程推荐 Python全栈+人工智能VIP课程,手把手带领大家从零基础学习Python语言.网络爬虫.数据分析以及人工智能应用开发.结合实际项目案例,由浅入深.全面系统地培养大家的独立开发能力,以 ...

  5. python中row是什么意思_row

    Oracle索引修复 ,ORA-00600: internal error code, arguments: [6200], 问题背景:客户反馈DB每天产生的incident日志很多,需要排查原因 查 ...

  6. python中row的使用_关于Python中openpyxl使用iter_rows()的方法

    之前已经对iter函数的用法有过讲解,记忆遗忘的小伙伴可以重新回顾一遍.今天就iter函数的拓展,讲讲openpyxl中导入iter_rows()的方法. 当我们使用以下代码: import open ...

  7. python里的π怎么调用_用python计算圆周率π

    用python计算圆周率π 一.要求 1.要起义能计算到圆周率后面越多位越好. 2.用进度条显示计算的进度,能给出越多种进度条越好. 3.要求给出圆周率π的具体公式或者算法说明. 二.算法 1.马青公 ...

  8. append在python里是什么意思_append在python里是什么意思

    网上有很多对这两个函数的区别讲解,但我觉得都讲的不是很清楚,记忆不深刻.这样解释清楚且容易记住. list.append(object) 向列表中添加一个对象object list.extend(se ...

  9. python里str什么意思_str在python中是什么意思

    左堂膏药(一盒10贴) 颈肩腰腿关节疼痛怎么办?我推荐你用[左堂膏药]一贴止痛,减少复发,哪疼贴那里,左堂黑膏药,传承中医疗法! 左堂膏药适用范围: 适于用四肢关节(网球肘.腱鞘炎.关节炎.足跟炎.膝 ...

最新文章

  1. 对PInvoke函数函数调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。...
  2. 重磅!2020中国高校毕业生月薪排名:清华第1,共计24高校月薪过万
  3. android游戏boss坐标,热血江湖手游boss刷新点坐标 boss刷新时间 _图文攻略_高分攻略_百度攻略...
  4. Dos命令控制Mysql语句(自己老记不住)
  5. java 中适配器原理_Java经典设计模式中关于适配器模式原理以及用法详解
  6. 如何自动完成登录 SAP BTP workflow(工作流) 管理应用 Launchpad 所需的设置
  7. uploadify 配置后,页面显示无效果
  8. java导致native非法指令,Java代码引起的NATIVE野指针问题(上)
  9. java 使用适当的签名_关于数字签名和policy文件设置!
  10. Latent Semantic Analysis (LSA) Tutorial第一部分(转载)
  11. Java 面试—乐/悲观锁,wait/notify/notifyAll对比
  12. Android VideoVIew 视频全屏拉伸
  13. Windows 7下可用的“超级终端”——Hypertrm和SecureCRT
  14. 系统集成项目管理: 三点估算法估算工期和方差的计算公式和习题
  15. ecshop 二次开发
  16. LaTeX beamer中minipage添加脚注(footnote)
  17. 常见的图像分割方法有以下几种
  18. java查找PDF关键字坐标 并且标记出来
  19. python 多线程 假的_天啦噜!Python多线程居然是骗人的
  20. 教你自定义Windows10微软输入法

热门文章

  1. sql查询将一对多转化为一对一
  2. 企业自动化运维ansible
  3. 失业培训计算机试题,2017年职称计算机考试考前练习试题(11)
  4. EXCEL 带公式单元格自动填充
  5. 手算前推回代求解潮流电压分布
  6. Redis(五)Redis内存维护方案(过期策略及淘汰策略)
  7. 在CentOS上解压含有中文名的ZIP文件出现乱码的解决办法
  8. 2022-2028年全球与中国短波红外(SWIR)行业深度分析
  9. 苹果无线耳机使用方法_苹果手机11新手使用方法
  10. GIC检测中断的流程