如何在Ipython中运行.py文件?

时间:2016-08-11 17:17:26

标签: python windows ipython argparse

Python和Ipython版本:

  1. 笔记本服务器的版本为3.0.0-f75fda4
  2. Python 2.7.9 | Anaconda 2.2.0(64位)|
  3. 问题描述

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

    1. Cars_20160601_01
    2. Cars_20160601_02
    3. Cars_20160601_03
    4. 所以,我首先将目录更改为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无法打开此文件:

      enter image description here

      请让我知道我做错了什么?另请注意,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
      --------------------------------------------------------------------
      

      似乎脚本无法“看到”Data目录中的任何文件。我在带有前缀python的cmd中尝试了相同的操作,它给出了相同的结果。我该如何解决这个问题? 供大家参考,我在这里粘贴了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')
      

      请注意我安装了0.2.3版本的undaqtools。

      更新2

      我也曾在Ipython中尝试过:

      %run -G C:/Users/durraniu/Anaconda/Scripts/undaq.py -r -d *
      

      这会产生反复出现的错误:
      enter image description here

2 个答案:

答案 0 :(得分: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参数,该参数由第一个文件名满足:&#39; 160601_02.daq&#39;。其他文件名因此是多余的,它正在抱怨。

我怀疑如果只提供一个文件名或当前目录名,它会运行得更好,如:

%run undaq.py .
%run undaq.py Cars_20160601_01.daq

我希望你在CMD中得到同样的错误

python undaq.py *

我不明白为什么1 getting started页面建议在命令行解析器提供此错误消息时使用*。我想知道是否存在版本差异 - 文档页面是针对不同版本的。

考虑做

python undaq.py -h
%run undaq.py -h

获得更全面的帮助信息。

https://github.com/rogerlew/undaqTools/blob/master/undaqTools/scripts/undaq.py

查看此代码,argparse参数的path定义为

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', '*']

答案 1 :(得分:0)

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

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

通过在命令行提示符下运行python来检查是否安装了python(您应该获得有关python版本和>>>提示符的一些信息)。退出python然后输入:

python undaq.py *

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