【问题标题】:How to make python process inputs from command line?如何从命令行进行python进程输入?
【发布时间】:2020-06-06 14:18:31
【问题描述】:

我有一个 Python 脚本,它最终会被转换成一个.exe 文件。它应该工作的方式是用户将一个excel文件拖放到python文件上,该文件将运行,并创建另一个输出excel文件。

但是,它需要来自用户的 2 个输入:groupssize

当我删除 excel 文件时,命令提示符会自动打开,并提示我输入。但是,提交值后,命令提示符会自动关闭,而不执行脚本的其余部分。

如果我在不提示用户的情况下硬编码groupssize 的值,问题就会消失。

代码如下:

import pandas as pd 
import sys

x = sys.argv[1]
file = pd.read_excel(x)
file = file.sample(frac=1).reset_index(drop=True)
file['Order'] = file.groupby('GENDER').cumcount()
file = file.sort_values(['Order', 'GENDER'], ascending=[True,False]).reset_index(drop=True)

groups = input ("Group number?") 
size = input ("Group size?") 
out = {}
count = 1
students = len(file)
std_sorted = 0

for i in range (0, len(file)-size, size): 
    if count != groups: 
        out["group"+str(count)] = file[i:(i+size)]
    else: 
        out["group"+str(count)] = file[i:]       
    count += 1 
    std_sorted += size 


if std_sorted != students: 
    out["group"+str(count)] = file[std_sorted:]

index = 0
writer = pd.ExcelWriter('output.xlsx')
for i in out:
    out[i].pop("Order")
    x = pd.DataFrame(out[i])
    x.to_excel(writer, index = False, sheet_name="Sheet"+str(index))
    workbook = writer.book # Access the workbook
    worksheet= writer.sheets["Sheet"+str(index)] # Access the Worksheet

    header_list = x.columns.values.tolist() # Generate list of headers
    for i in range(0, len(header_list)):
        worksheet.set_column(i, i, len(header_list[i])+2) # Set column widths based on len(header)

    index += 1

writer.save()

【问题讨论】:

  • 命令提示符会自动关闭而不执行脚本的其余部分。 - 你确定它没有被执行吗?如果没有东西持有它,窗口将关闭。这并不意味着它没有被执行。您可以在脚本末尾添加input("Press Enter to exit...")
  • 是的,我确信它没有被执行。我尝试了print (groups),甚至没有打印输出。如果我在脚本中对groupssize 的值进行硬编码,则会执行该文件,这由生成的输出 excel 文件指示。
  • @Tomerikoo 不幸的是,在脚本末尾再次提示用户输入也不会发生。只要我提供了groupssize 的值并在命令提示符下按回车,即使我在脚本末尾再次提示用户,它也会关闭。这就是它如此令人困惑的原因。
  • 再一次,没有打印输出,因为可能窗口在您看到它之前就关闭了。在末尾添加input 行和groupssize 输入之后的打印语句,我相信它们会被打印出来

标签: python python-3.x command-line-interface command-prompt


【解决方案1】:

我可以在不运行代码的情况下将代码复制粘贴到 Pycharm 中找到您的问题(Pycharm 在代码检查方面做得很好)...

行:

for i in range (0, len(file)-size, size): 

总是会引发TypeError 异常。发生这种情况是因为 len(...) 是一个 int,但 size 是一个字符串,因为它是一个输入。您需要将输入更改为:

groups = int(input("Group number?"))
size = int(input("Group size?"))

【讨论】:

  • 我的错!非常感谢@Tomerikoo!我也刚刚意识到。非常感谢!无法相信经过多年的编码之后我是如何错过它的......
  • 发生在最好的情况下。但正如我试图在 cmets 中告诉您的那样,调试它的基本步骤将是在 IDE 或 shell 中运行,因为您无法真正看到发生了什么。如果您只是从命令行运行脚本,您将立即看到错误...
  • 顺便说一句,@Tomerikoo,这是我第一次将 .py 转换为 .exe 。如果用户只得到我的.exe 并且他们没有 python 或其库,例如安装了 pandas,他们能毫无问题地运行这个文件吗?
  • 不幸的是,我没有太多将.py 转换为.exe 的经验。我主要在脚本直接从 shell 运行的工作环境中使用 Python 编写脚本。但是我相信有些包可以将您的程序打包为具有所有必要依赖项的独立程序。我相信你可以在这里找到很多关于这个主题的信息
【解决方案2】:

试试

groups = int(input ("Group number?")) size = int(input ("Group size?"))

而不是

groups = input ("Group number?") size = input ("Group size?")

我认为这是一个类型转换问题。试试吧,也许它可以解决你的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    • 2015-12-19
    相关资源
    最近更新 更多