【问题标题】:Transfering arguments in Automator's workflow . Python Shells在 Automator 工作流程中传输参数。蟒蛇壳
【发布时间】:2013-09-28 19:44:14
【问题描述】:

所以我在 Apple 的 Automator 中创建了一个在 shell 中使用 Python 脚本的工作流

这是每个步骤现在正在做的事情:

1 .我从 excel 中粘贴一列名称

2 。将它们组织在一个列表中......例如['a','b','c'] 。 . .这就是奇怪的地方

3 .我在查找器项目上选择了一个文本文件,它是第二个 python 脚本(#4)中的输入,但问题是我还需要在我的脚本中从 #2 生成的列表

4 .该脚本应该使用#2 中的列表和#3 选择的文件

当我没有 #3 时,它工作正常,因为我使用 sys.argv1 来获取要传输的变量,但我不知道如何跳过将其输入“询问 Finder 项目” " 直接进入#4

基本上,在为另一个变量选择文件时,我无法将工作流中的列表输入到脚本中,这样我就可以拥有:

my_list = sys.argv[1] #from step 2
my_file = sys.argv[2] #selected from step 3

【问题讨论】:

    标签: python file input arguments automator


    【解决方案1】:

    除非您在 #3 中选择“忽略此操作的输入”,否则它只会将所选文件附加到脚本 #2 的输出作为其输出,因此脚本 #4 会获取它们。

    问题是你得到一个隐含的“从文本到文件/文件夹的转换”,将#2 输入到#3。因此,如果 #2 的输出是一个看起来像路径名但不是的字符串列表,它们将被转换为不存在文件的路径名,这些文件将被转换为对不存在文件的引用,这将当#3 的输出转换回#4 的文本时,就会被丢弃。


    解决这个问题的简单方法(概念上很简单;这确实意味着一些额外的代码......)是让脚本 #2 将列表存储在一个临时文件中,并打印出文件名。该文件名将通过转换并很好地出现在另一端,因此脚本 #4 可以打开并读取文件以取回列表。

    举一个愚蠢的例子,假设你正在这样做:

    import sys
    new_list = sorted(sys.argv[1:])
    print '\n'.join(new_list)
    

    相反,这样做:

    import sys
    import tempfile
    new_list = sorted(sys.argv[1:])
    with tempfile.NamedTemporaryFile('w', delete=False) as f:
        f.write('\n'.join(new_list))
        print f.name
    

    然后,在脚本 #4 中,而不是这样:

    import sys
    new_list = sys.argv[1:-1]
    step3 = sys.argv[-1]
    

    ……这样做:

    import sys
    with open(sys.argv[1]) as f:
        new_list = list(f)
    os.remove(sys.argv[1])
    step3 = sys.argv[2]
    

    当然,在一个更实际的例子中,您可能希望使用 pickle.dump 而不仅仅是 '\n'.join,但这应该足以说明这个想法。

    【讨论】:

    • 非常感谢,这正是我所需要的!快速提问。 . .所以我正在继续我的功能,并且有一部分我试图使用 os.path.split(input) 分割路径,其中输入是 sys.argv[2] 。 . .由于某种原因出现错误?我检查以确保 sys.argv[2] 是一个字符串,它看起来不错。我不知道为什么 dir,file = os.path.split(input) 不起作用。 . .它在 CodeRunner 中工作
    • @draconisthe0ry: 什么错误?您可以在某处发布相关代码吗?你确定你记得import os.path? (Automator 会自动为您填写一些 import 语句,但不是那个。)如果这不是一件非常琐碎的事情,那么您似乎应该创建一个新问题,并让其他人关注它,而不仅仅是我的。
    • hej,所以我只是尝试了 import os.path 并且我得到了同样的错误。在 automator 中工作的困难在于它会告诉您错误在哪里,但只会告诉您错误所在的行在哪里。我在stackoverflow.com/questions/18970231/… 中解释了所有内容,但我没有收到任何人关于解决方案的消息。我检查了 sys.version,我的终端运行的是 2.7.3,Automator 运行的是 2.7.2,但我认为这不会影响任何事情
    • @draconisthe0ry:最后一点意味着您已经安装了第三方 Python 实现,并以某种方式修改了您的 $PATH,使其优先于 Apple 的股票 /usr/bin/python ,这可能会导致很多混乱(例如,您使用easy_installeasy_install-2.7 安装了一些东西,而当您只运行pythonpython2.7 时它无法导入)......但这不会导致那个问题。
    • @draconisthe0ry:另外,如果你在网上搜索,我想人们已经想出了如何在 Run Shell Script 操作中添加更多“Shell:”选项,这意味着如果你想要你的第三方Python 将在 Automator 中可用,你可以在那里获得它……但你可能不需要它。
    猜你喜欢
    • 1970-01-01
    • 2020-06-05
    • 1970-01-01
    • 2018-07-05
    • 2020-04-30
    • 2018-01-15
    • 1970-01-01
    • 2013-10-06
    • 2010-11-04
    相关资源
    最近更新 更多