【问题标题】:How to run a .py file in Ipython?如何在 Ipython 中运行 .py 文件?
【发布时间】:2016-12-18 13:18:12
【问题描述】:

Python 和 Ipython 版本:

  1. 笔记本服务器的版本是3.0.0-f75fda4
  2. Python 2.7.9 |Anaconda 2.2.0(64 位)|

问题描述

我在 Python 中使用 undaqtools 模块。包裹页面是here。该软件包包含将数据采集文件 (DAQ) 从驾驶模拟器输出转换为 HDF5 格式的功能。根据包页面有两种方法可以做到这一点。一种方法是使用函数daq.readdaq.write_hd5 逐个转换文件。我已经使用了几次,它完美无缺。第二种方法是使用脚本undaq.py同时批量转换多个DAQ文件。该脚本位于 C 盘 (Windows 7) 中的 /Anaconda/Scripts/ 中。我在DrivingSimulator/Data 文件夹中有 3 个 DAQ 文件,命名为:

  1. 汽车_20160601_01
  2. 汽车_20160601_02
  3. 汽车_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 *

这会重复出现错误:

【问题讨论】:

    标签: python windows ipython argparse


    【解决方案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 不在当前目录中。你之前运行过pythonipython 代码吗?
    • undaq.py 脚本文件位于 Anaconda/Scripts/ 文件夹中。是的,我之前运行过 Ipython 代码,但之前从未运行过 .py 脚本文件。我很困惑,接下来我应该怎么做才能解决这个问题?感谢您的帮助。
    【解决方案2】:

    你不应该在 ipython 中运行undaq。它是一个独立的脚本。

    要运行 python 程序,您需要使用 python 解释器。典型的 python 安装将 .py 文件与 python 解释器相关联。但是,在您的系统上似乎没有发生这种情况。

    通过在命令行提示符处运行python 来检查您是否安装了python(您应该获得有关python 版本的一些信息,以及&gt;&gt;&gt; 提示符)。从 python 中退出,然后输入:

    python undaq.py *
    

    这会加载 python 解释器并告诉它读取并执行文件undaq.py 中的命令,并将当前目录中的所有文件作为参数传递。

    【讨论】:

    • python 安装在我的系统中。我通过输入 python 再次检查,它确实显示了&gt;&gt;&gt; 提示。但是一旦我在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\*
    猜你喜欢
    • 2021-03-31
    • 2021-10-16
    • 1970-01-01
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    • 2014-01-28
    • 2021-01-13
    相关资源
    最近更新 更多