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) 愚蠢,因为我第二次做对了
@BJBeans 我改变了我的答案。希望它会有所帮助。
谢谢! if name == 'main' 背后的想法是什么:我一直在其他地方读到它,但不确定它如何适用于我的具体情况
在您的情况下,如果脚本是主脚本(不是导入)RunMyScript ()
会自动调用。因此,如果您在其他脚本中导入脚本,RunMyScript ()
不会自动调用。您可以阅读“如果此脚本是主脚本,请执行此操作..”之类的条件以上是关于Python:使用另一个函数从命令行调用我的脚本的主要内容,如果未能解决你的问题,请参考以下文章
使用参数 + stdout + stderr 从命令行调用 MFC 应用程序