python的文件格式有两种,"*.py"和"*.pyw",它们有啥不同?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python的文件格式有两种,"*.py"和"*.pyw",它们有啥不同?相关的知识,希望对你有一定的参考价值。
它们之间的不同就只有一个:视窗运行它们的时候调用不同的执行档案。
视窗用 python.exe 运行 .py ,用 pythonw.exe 运行 .pyw 。
这纯粹是因为安装视窗版 Python 时,扩展名 .py 自动被登记为用 python.exe 运行的文件,而 .pyw 则被登记为用 pythonw.exe 运行。
主要体现在win平台上开发桌面程序,linux木有哦 python.exe 运行 .py ,用 pythonw.exe 运行 .pyw,不出现dos窗口, 住:纯图形界面程序的用户不需要看到dos窗口。
扩展资料
Python open() 方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError。
注意:使用 open() 方法一定要保证关闭文件对象,即调用 close() 方法。
open() 函数常用形式是接收两个参数:文件名(file)和模式(mode)。
完整的语法格式为:
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
参考资料来源:
百度百科——Python
视窗用 python.exe 运行 .py ,用 pythonw.exe 运行 .pyw 。
这纯粹是因为安装视窗版 Python 时,扩展名 .py 自动被登记为用 python.exe 运行的文件,
而 .pyw 则被登记为用 pythonw.exe 运行。
.py 和 .pyw 之间的“其它差别”全都是 python.exe 和 pythonw.exe 之间的差别。
跟 python.exe 比较起来,pythonw.exe 有以下的不同:
1)执行时不会弹出控制台窗口(也叫 DOS 窗口)
2)所有向原有的 stdout 和 stderr 的输出都无效
3)所有从原有的 stdin 的读取都只会得到 EOF
.pyw 格式是被设计来运行开发完成的纯图形界面程序的。
纯图形界面程序的用户不需要看到控制台窗口。
值得一提的是,开发纯图形界面程序的时候,你可以暂时把 .pyw 改成 .py ,
以便运行时能调出控制台窗口,看到所有错误信息,方便除虫。
注:唯独视窗版 Python 有 .pyw 格式。 参考技术B 实际上区别不大,不过*.py用python.exe解释,运行时会出现控制台窗口(也就是字符界面),*.pyw则用pythonw.exe解释,运行时不会出现控制台窗口,主要用于一些要图形界面的程序上,没理由当打开一个windows界面的时候还要在后面开一个黑黑的窗口吧,着应该是设计者的初衷吧我猜。
如何在 Ipython 中运行 .py 文件?
【中文标题】如何在 Ipython 中运行 .py 文件?【英文标题】:How to run a .py file in Ipython? 【发布时间】:2016-12-18 13:18:12 【问题描述】:Python 和 Ipython 版本:
-
笔记本服务器的版本是
3.0.0-f75fda4
。
Python 2.7.9
|Anaconda 2.2.0
(64 位)|
问题描述
我在 Python 中使用 undaqtools
模块。包裹页面是here。该软件包包含将数据采集文件 (DAQ) 从驾驶模拟器输出转换为 HDF5 格式的功能。根据包页面有两种方法可以做到这一点。一种方法是使用函数daq.read
和daq.write_hd5
逐个转换文件。我已经使用了几次,它完美无缺。第二种方法是使用脚本undaq.py
同时批量转换多个DAQ文件。该脚本位于 C 盘 (Windows 7) 中的 /Anaconda/Scripts/
中。我在DrivingSimulator/Data
文件夹中有 3 个 DAQ 文件,命名为:
-
汽车_20160601_01
汽车_20160601_02
汽车_20160601_03
所以,我首先将目录更改为DrivingSimulator/Data
。然后根据包的Getting Started页面,在IPython中尝试undaq.py *
命令,报错:
%run C:/Users/durraniu/Anaconda/Scripts/undaq.py *
usage: undaq.py [-h] [-n NUMCPU] [-o OUTTYPE] [-e ELEMFILE] [-r] [-d] path
undaq.py: error: unrecognized arguments: Cars_20160601_02.daq Cars_20160601_03.daq
An exception has occurred, use %tb to see the full traceback.
SystemExit: 2
这是完整的回溯:
%tb
---------------------------------------------------------------------------
SystemExit Traceback (most recent call last)
C:\Users\durraniu\Anaconda\lib\site-packages\IPython\utils\py3compat.pyc in execfile(fname, glob, loc, compiler)
205 filename = fname
206 compiler = compiler or compile
--> 207 exec(compiler(scripttext, filename, 'exec'), glob, loc)
208
209 else:
C:\Users\durraniu\Anaconda\lib\site-packages\undaqtools-0.2.3-py2.7.egg\EGG-INFO\scripts\undaq.py in <module>()
2 # EASY-INSTALL-SCRIPT: 'undaqtools==0.2.3','undaq.py'
3 __requires__ = 'undaqtools==0.2.3'
----> 4 __import__('pkg_resources').run_script('undaqtools==0.2.3', 'undaq.py')
C:\Users\durraniu\Anaconda\lib\site-packages\setuptools-18.4-py2.7.egg\pkg_resources\__init__.py in run_script(self, requires, script_name)
733 ns.clear()
734 ns['__name__'] = name
--> 735 self.require(requires)[0].run_script(script_name, ns)
736
737 def __iter__(self):
C:\Users\durraniu\Anaconda\lib\site-packages\setuptools-18.4-py2.7.egg\pkg_resources\__init__.py in run_script(self, script_name, namespace)
1657 )
1658 script_code = compile(script_text, script_filename,'exec')
-> 1659 exec(script_code, namespace, namespace)
1660
1661 def _has(self, path):
C:\Users\durraniu\Anaconda\lib\site-packages\undaqtools-0.2.3-py2.7.egg\EGG-INFO\scripts\undaq.py in <module>()
C:\Users\durraniu\Anaconda\lib\argparse.pyc in parse_args(self, args, namespace)
1702 if argv:
1703 msg = _('unrecognized arguments: %s')
-> 1704 self.error(msg % ' '.join(argv))
1705 return args
1706
C:\Users\durraniu\Anaconda\lib\argparse.pyc in error(self, message)
2372 """
2373 self.print_usage(_sys.stderr)
-> 2374 self.exit(2, _('%s: error: %s\n') % (self.prog, message))
C:\Users\durraniu\Anaconda\lib\argparse.pyc in exit(self, status, message)
2360 if message:
2361 self._print_message(message, _sys.stderr)
-> 2362 _sys.exit(status)
2363
2364 def error(self, message):
SystemExit: 2
我无法理解这个错误。另外,我尝试在 CMD 中使用undaq.py
,但打开了一个新窗口,提示 Windows 无法打开此文件:
请让我知道我做错了什么?另外,请注意Script
文件夹和Python的路径已经在系统变量的PATH变量中。
更新:
按照@hpaulj 的指示,我做了以下操作:
## Changing to the directory containing DAQ files:
%cd C:/Users/durraniu/Documents/DrivingSimulator/Data
## Running the undaq.py script:
%run C:/Users/durraniu/Anaconda/Scripts/undaq.py -r -d \\*
这给了我以下输出:
Glob Summary
--------------------------------------------------------------------
hdf5
daq size (KB) exists
--------------------------------------------------------------------
--------------------------------------------------------------------
debug = True
rebuild = True
Converting daqs with 1 cpus (this may take awhile)...
Debug Summary
Batch processing completed.
--------------------------------------------------------------------
Conversion Summary
--------------------------------------------------------------------
Total elapsed time: 0.1 s
Data converted: 0.000 MB
Data throughput: 0.0 MB/s
--------------------------------------------------------------------
脚本似乎无法“看到”数据目录中的任何文件。我在 cmd 中尝试了相同的前缀python
,它给出了相同的结果。我该如何解决这个问题?
供您参考,我将undaq.py
文件的内容粘贴到这里:
#!C:\Users\durraniu\Anaconda\python.exe
# EASY-INSTALL-SCRIPT: 'undaqtools==0.2.3','undaq.py'
__requires__ = 'undaqtools==0.2.3'
__import__('pkg_resources').run_script('undaqtools==0.2.3', 'undaq.py')
请注意,我安装了 undaqtools 版本 0.2.3。
更新 2
我也尝试过在 Ipython 中进行以下操作:
%run -G C:/Users/durraniu/Anaconda/Scripts/undaq.py -r -d *
这会重复出现错误:
【问题讨论】:
【参考方案1】:用一个简单的脚本,echo_argv.py
:
import sys
print(sys.argv)
使用命令行在 Ipython 中运行它:
In [1222]: %run echo_argv *
['echo_argv.py', 'stack38002264.py', 'stack37714032.py', 'test', 'stack37930737.py ...]
表明它在sys.argv
中获得了完整的目录列表。
您的第一个错误是由undaq.py
的命令行解析器产生的(因此是argparse
错误堆栈)。
usage: undaq.py [-h] [-n NUMCPU] [-o OUTTYPE] [-e ELEMFILE] [-r] [-d] path
undaq.py: error: unrecognized arguments: Cars_20160601_02.daq Cars_20160601_03.daq
此消息告诉我 undaq
需要一个 path
参数,第一个文件名满足该参数:“160601_02.daq”。其他文件名因此是多余的,它在抱怨。
我怀疑如果你只给它一个文件名或当前目录名,它会运行得更好,比如:
%run undaq.py .
%run undaq.py Cars_20160601_01.daq
如果你在 CMD 中这样做,我希望你会得到同样的错误
python undaq.py *
当命令行解析器给出此错误消息时,我不明白为什么 1getting started
页面建议使用 *
。我想知道是否存在版本差异 - 文档页面适用于不同的版本。
考虑做
python undaq.py -h
%run undaq.py -h
获取更全面的帮助信息。
https://github.com/rogerlew/undaqTools/blob/master/undaqTools/scripts/undaq.py
查看此代码,path
参数的 argparse
定义是
parser.add_argument('path', type=str, help='Path for glob ("*")')
这表明正确的调用是引用 '*'
,因此它按原样传递给脚本,而不是由 shell 评估
python undaq.py '*'
但是我在使用 %run
时遇到了同样的问题。
undaq.py
有自己的glob
,因此它需要一个路径字符串,而不是由 shell glob
生成的完整列表。
以下是 %run
对 globing 的评价:
Arguments are expanded using shell-like glob match. Patterns
'*', '?', '[seq]' and '[!seq]' can be used. Additionally,
tilde '~' will be expanded into user's home directory. Unlike
real shells, quotation does not suppress expansions. Use
*two* back slashes (e.g. ``\\*``) to suppress expansions.
To completely disable these expansions, you can use -G flag.
所以我需要这样做:
In [1236]: %run echo_argv \\*
['echo_argv.py', '*']
In [1237]: %run -G echo_argv *
['echo_argv.py', '*']
【讨论】:
我尝试运行python undaq.py '*'
,但它抛出错误:python: can't open file 'undaq.py': [Errno 2] No such file or directory
该错误表明undaq.py
不在当前目录中。你之前运行过python
和ipython
代码吗?
undaq.py 脚本文件位于 Anaconda/Scripts/ 文件夹中。是的,我之前运行过 Ipython 代码,但之前从未运行过 .py 脚本文件。我很困惑,接下来我应该怎么做才能解决这个问题?感谢您的帮助。【参考方案2】:
你不应该在 ipython 中运行undaq
。它是一个独立的脚本。
要运行 python 程序,您需要使用 python 解释器。典型的 python 安装将 .py 文件与 python 解释器相关联。但是,在您的系统上似乎没有发生这种情况。
通过在命令行提示符处运行python
来检查您是否安装了python(您应该获得有关python 版本的一些信息,以及>>>
提示符)。从 python 中退出,然后输入:
python undaq.py *
这会加载 python 解释器并告诉它读取并执行文件undaq.py
中的命令,并将当前目录中的所有文件作为参数传递。
【讨论】:
python 安装在我的系统中。我通过输入 python 再次检查,它确实显示了>>>
提示。但是一旦我在DrivingSimulator/Data
目录中输入python undaq.py *
,就会出现错误:python: can't open file 'undaq.py': [Errno 2] No such file or directory
@umairdurrani 你需要执行python path\to\undaq.py *
或者或者去undaq.py
所在的地方运行python undaq.py path\to\DrivingSimulator\Data\*
以上是关于python的文件格式有两种,"*.py"和"*.pyw",它们有啥不同?的主要内容,如果未能解决你的问题,请参考以下文章