Python:使用另一个函数从命令行调用我的脚本

Posted

技术标签:

【中文标题】Python:使用另一个函数从命令行调用我的脚本【英文标题】:Python: Call my script from command line using another function 【发布时间】:2015-11-02 23:56:06 【问题描述】:

我在一个名为 MyScript.py 的文件中定义了一个名为 MyScript() 的函数。 MyScript 接受几个我想在命令行中提示用户输入的参数。所以我在 RunMyScript.py 中定义了一个单独的函数 RunMyScript() 来首先在命令行中运行来收集参数:

def RunMyScript():
  import os
  dir1 = input('Enter the Directory1 file path: ')
  dir2 = input('Enter the Directory2 file path: ')
  dir3 = input('Enter the Directory3 file path: ' )
  flag = input('Flag? (Y/N): ')

os.chdir = dir1
from MyScript import MyScript
MyScript(dir2,dir3,flag)

然后通常 MyScript 函数开始:

def MyScript(dir2,dir3,flag="N"):
    import os

    os.chdir(dir2)
    if flag=="Y":
    DoSomething
    wb.save(dir3)

当我尝试在命令行中运行 RunMyScript 时,我收到错误“TypeError: 'str' object is not callable。我怀疑它与它如何解释标志输入 Y 或 N 有关,但我不积极。

我是 Python 和该网站的新手,所以如果问题表述不正确,请原谅我,我会根据需要提供更多详细信息,并且我已经在网站上搜索了类似的问题,但不清楚我是否有和过去其他人一样的问题。

谢谢。

【问题讨论】:

错误发生在哪一行?该行的内容是什么? 你试过在输入中添加单引号吗? 在进行了@Kevin 下面建议的更改后,我现在将其缩小到 Flag arg 并且我认为它是如何传递到 MyScript 的。认为是因为来自 RunMyScript“Y”或“N”的用户输入被解释为字符串,因此在尝试调用 MyScript 时失败。所以我需要转换为变量。如果可行,将发布答案 我的临时解决方案感觉很便宜,但基本上我只是在 RunMyScript 中添加了几行说“如果标志 = N 标志 =1 elif 标志 = Y 标志 = 2”,然后将它作为 int 传递给 MyScript 不是一条海峡让帖子保持打开状态,因为其他人可能有更好的答案,可能对其他人有用 【参考方案1】:

我不完全确定您要做什么,但我认为您的问题与该行有关:

os.chdir = dir1

您正在将 os.chdir 更改为字符串。要正确更改您应该使用的目录:

os.chdir(dir1)

【讨论】:

这是其中的一部分,谢谢。更广泛地说 - 我正在尝试使用 Run 函数为用户提供一种更简单/提示的方式,以便在 MyScript 执行之前在命令行中为 MyScript(特定于其环境)分配所需的目录参数。认为我也可以预先进行一些错误处理 - 所以如果他们输入错误的目录。可能有更好的整体方法来做到这一点,例如,我在搜索此站点时看到了一些对“sys”模块的引用,但不确定它是否适用。【参考方案2】:

在 MyScript 函数中,您调用 os.chdir(dir2)os.chdir 是一个字符串,它是不可调用的。请改用os.chdir = dir2

编辑:恰恰相反……我很困惑。

但是现在,您没有范围问题吗?当我复制粘贴您的代码时,它不起作用,因为 os.chdir(dir1)import os 不在同一范围内。

我建议您将所有import 移动到脚本顶部,并将raw_input 中的input 更改为对字符串输入的最佳支持。

尝试像这样更改您的代码:

import os
import MyScript

def RunMyScript():
    dir1 = raw_input('Enter the Directory1 file path: ')
    dir2 = raw_input('Enter the Directory2 file path: ')
    dir3 = raw_input('Enter the Directory3 file path: ' )
    flag = raw_input('Flag? (Y/N): ')

    os.chdir(dir1)
    MyScript(dir2, dir3, flag)

if __name__ == '__main__':
    RunMyScript()

对于 MyScript:

import os 

def MyScript(dir2, dir3, flag = "N"):
    os.chdir(dir2)

    if flag == "Y":
        #Do Something

    wb.save(dir3)

希望能解决你的问题。

【讨论】:

根据documentation,os.chdir()肯定是一个函数。 这绝对是上面提到的@Kevin 问题的一部分,应该是:运行MyScript 中的os.chdir(dir1) 愚蠢,因为我第二次做对了 @BJB​​eans 我改变了我的答案。希望它会有所帮助。 谢谢! if name == 'main' 背后的想法是什么:我一直在其他地方读到它,但不确定它如何适用于我的具体情况 在您的情况下,如果脚本是主脚本(不是导入)RunMyScript () 会自动调用。因此,如果您在其他脚本中导入脚本,RunMyScript () 不会自动调用。您可以阅读“如果此脚本是主脚本,请执行此操作..”之类的条件

以上是关于Python:使用另一个函数从命令行调用我的脚本的主要内容,如果未能解决你的问题,请参考以下文章

使用参数 + stdout + stderr 从命令行调用 MFC 应用程序

shell从外部读入参数调用另一个shell脚本的问题

使用#!/ usr / bin / env python3 shebang和Windows

Java调用Python脚本并获取返回值

来自另一个用户的 DBus

如何避免从 Bash 脚本中多次调用 Python 解释器?