【问题标题】:Using command-line parameters within Jupyter notebook在 Jupyter 笔记本中使用命令行参数
【发布时间】:2019-01-10 05:41:20
【问题描述】:

我正在 Jupyter 笔记本中运行一个 python 脚本,并尝试在一个列表中循环它。但是,命令行变量不会被识别为变量,而是被视为字符串。 This questionthis question 似乎与我想要的相似,但我没有使用 argparse 的经验,所以不知道从哪里开始。

我的代码:

import got
retailers = ["handle1", "handle2"]

for retailer in retailers:
    string = "keyword " + "@"+ retailer
    file_name = "keyword_" + retailer
    %run Exporter.py --querysearch string --since 2018-01-01 --maxtweets 50 --output file_name

从命令行运行时的样子:

python Exporter.py --querysearch "keyword @retailer" --since 2018-01-01 --maxtweets 50 --output "keyword_retailer"

问题在于脚本 Exporter.py 正在搜索术语“零售商”,而不是我真正想要的,即“关键字 @Retailer”。输出文件也一样,它被保存为“file_name”而不是“keyword_retailer”。

关于如何解决这个问题的任何想法?

如果需要上下文,我使用this package

编辑:

我已将此添加到我的代码中,但是我收到下面列出的错误。我还附加了模块 Exporter.py,因为我似乎无法修复此错误。

import argparse
import sys
import Exporter 
def main(args):
    # parse arguments using optparse or argparse or what have you
    parser = argparse.ArgumentParser(description="Do something.")
    parser.add_argument("--querysearch", type=str, default= 2, required=True)
    parser.add_argument("--maxtweets", type=int, default= 4, required=True)
    parser.add_argument("--output", type=str, default= 4, required=True)
    parser.add_argument("--since", type=int, default= 4, required=True)

if __name__ == '__main__':
    import sys
    main(sys.argv[1:])

for retailer in retailers:
    string = "palm oil " + "@"+ retailer
    file_name = "palm_oil_" + retailer
    #print string
    #print file_name
    Exporter.main([string,"2018-01-01", 50, file_name])

错误信息:

UnboundLocalError                         Traceback (most recent call last)
<ipython-input-35-4731f5aa548f> in <module>()
      4     #print string
      5     #print file_name
----> 6     Exporter.main([string,"2018-01-01", "50", file_name])

/Users/jamesozden/GetOldTweets-python-master/Exporter.pyc in main(argv)
     70                 got.manager.TweetManager.getTweets(tweetCriteria, receiveBuffer)
     71 
---> 72 
     73         finally:
     74                 outputFile.close()

UnboundLocalError: local variable 'arg' referenced before assignment

根据另一个问题的答案,我也尝试过使用 {} 来表示变量而不是字符串的这种风格解决方案,但没有成功:

!python training.py --cuda --emsize 1500 --nhid 1500 --dropout {d} --epochs {e} 

【问题讨论】:

    标签: python-2.7 command-line jupyter-notebook command-line-arguments argparse


    【解决方案1】:

    您的描述不清楚何时从 shell 运行脚本,以及何时从ipython(或notebook)使用%run,所以我将重点关注argparse 问题:

    首先这需要一个parse_args:

    def main(argv):
        # parse arguments using optparse or argparse or what have you
        parser = argparse.ArgumentParser(description="Do something.")
        parser.add_argument("--querysearch", type=str, default= 2, required=True)
        parser.add_argument("--maxtweets", type=int, default= 4, required=True)
        parser.add_argument("--output", type=str, default= 4, required=True)
        parser.add_argument("--since", type=int, default= 4, required=True)
    
        args = parse_args(argv)
        print(args)     # a good debugging step
        return args   # or do something with them
    

    argv 参数需要看起来像通过sys.argv[1:] 获得的东西

    一个类似的列表:

    ['--querysearch', "keyword @retailer", 'since', '2018-01-01', ...]
    

    我打算在

    上使用split()
    '--querysearch "keyword @retailer" --since 2018-01-01 --maxtweets 50 --output "keyword_retailer"'
    

    但它不会处理“关键字”之后的嵌入空间。 (lexsplit可以)。

    如果您将所有这些参数都设为required,那么提供default 参数是没有意义的。相反,提供默认值并删除所需的。对于 type=str 的参数,像 4 这样的默认值并不是一个好主意。它们可以工作,但可能会扰乱进一步的处理(args.output 是字符串还是数字?)。

    另一种“绕过”解析器的方法是定义一个Namespace 对象:

     args = argparse.Namespace(querysearch='foo', maxtweets=4, output='afile', since=4)
    

    【讨论】:

    • 感谢您的回复。澄清一下,我正在从 Jupyter 笔记本运行脚本“Exporter.py”,我通常从命令行运行该脚本。但是我仍然不确定如何在我的代码中实际实现解析参数方法,以便我实际上可以遍历不同的变量?如,我不清楚我在哪里或以什么格式输入搜索功能的参数。
    猜你喜欢
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 2021-06-25
    • 2020-10-12
    相关资源
    最近更新 更多