Python 为多个目标编写具有一个规则的makefile?

Python 为多个目标编写具有一个规则的makefile?,python,windows,qt,makefile,pyqt4,Python,Windows,Qt,Makefile,Pyqt4,这似乎是一个非常简单的问题,但我找不到任何方法来解决它 我的意图是通过调用pyuic4命令(从)将每个“.ui”文件转换为“.py”文件。我试图用一个非常短的makefile来管理它: %.py: %.ui pyuic4 $< --output $@ 使用显式文件名从命令行调用pyuic4是有效的 我知道我可以自己指定任何目标文件,但如果可能的话,我希望避免这种情况 有什么想法吗?因为您显然在使用GNU Makefile语法,我建议您这样编写规则: UIFILES = $(wil

这似乎是一个非常简单的问题,但我找不到任何方法来解决它

我的意图是通过调用pyuic4命令(从)将每个“.ui”文件转换为“.py”文件。我试图用一个非常短的makefile来管理它:

%.py: %.ui
    pyuic4 $< --output $@
使用显式文件名从命令行调用pyuic4是有效的

我知道我可以自己指定任何目标文件,但如果可能的话,我希望避免这种情况


有什么想法吗?

因为您显然在使用GNU Makefile语法,我建议您这样编写规则:

UIFILES = $(wildcard *.ui)

.PHONY: ui2py

ui2py: $(UIFILES)
        @for uifile in $(UIFILES); do \
                pyuic4 $$(uifile) --output $${uifile%.ui}.py; \
        done

由于您显然在使用GNU Makefile语法,我建议您这样编写规则:

UIFILES = $(wildcard *.ui)

.PHONY: ui2py

ui2py: $(UIFILES)
        @for uifile in $(UIFILES); do \
                pyuic4 $$(uifile) --output $${uifile%.ui}.py; \
        done

根据kasterma的评论,您需要告诉make要构建哪个目标,但您只提供了一个模式规则。这可以通过以下方式完成

UIFILES := $(wildcard *.ui)
PYFILES := $(UIFILES:.ui=.py)

.PHONY: all
all: $(PYFILES)

%.py: %.ui
    pyuic4 $< --output $@
ui文件:=$(通配符*.ui)
PYFILES:=$(UIFILES:.ui=.py)
冒牌货:全部
全部:$(PYFILES)
%.py:%.ui
pyuic4$<--输出$@

根据kasterma的评论,您需要告诉make要构建哪个目标,但您只提供了一个模式规则。这可以通过以下方式完成

UIFILES := $(wildcard *.ui)
PYFILES := $(UIFILES:.ui=.py)

.PHONY: all
all: $(PYFILES)

%.py: %.ui
    pyuic4 $< --output $@
ui文件:=$(通配符*.ui)
PYFILES:=$(UIFILES:.ui=.py)
冒牌货:全部
全部:$(PYFILES)
%.py:%.ui
pyuic4$<--输出$@

尽管这个问题可以通过perror或eriktous的解决方案来解决,但我现在要走eriktous提到的第三条路,只需使用shell脚本调用pyuic4命令。它运行得相当快,即使输出结果是相同的文件,也不会对源代码控制造成任何损害

我遇到了第二点,这可能分散了我的注意力。pyuic4命令的真正名称是pyuic4.bat,它在Windows中是一个“批处理文件”,类似于Linux/Unix环境中的shell脚本;相似,但不完全相同。如果从另一个批处理文件调用批处理文件,则应使用前导的“call”语句调用该批处理文件,以防止在第一次调用后终止批处理

如果我有三个文件(@符号是为了防止命令在执行过程中被列出)

。。。结果是公正的

D:\Projekte\test>main
This is sub 1
因此,对于这个非常小的问题,我的“解决方案”是一个名为“update.cmd”的简单批处理文件,它可以通过以下行的副本进行扩展:

call pyuic4 mainwindow.ui --output mainwindow.py
这不是我最初想要的,但对我来说很有效


但无论如何,感谢您的帮助:-)

尽管这个问题可以通过perror或eriktous的解决方案来解决,但我现在要走eriktous提到的第三条路,只需使用shell脚本调用pyuic4命令。它运行得相当快,即使输出结果是相同的文件,也不会对源代码控制造成任何损害

我遇到了第二点,这可能分散了我的注意力。pyuic4命令的真正名称是pyuic4.bat,它在Windows中是一个“批处理文件”,类似于Linux/Unix环境中的shell脚本;相似,但不完全相同。如果从另一个批处理文件调用批处理文件,则应使用前导的“call”语句调用该批处理文件,以防止在第一次调用后终止批处理

如果我有三个文件(@符号是为了防止命令在执行过程中被列出)

。。。结果是公正的

D:\Projekte\test>main
This is sub 1
因此,对于这个非常小的问题,我的“解决方案”是一个名为“update.cmd”的简单批处理文件,它可以通过以下行的副本进行扩展:

call pyuic4 mainwindow.ui --output mainwindow.py
这不是我最初想要的,但对我来说很有效


但无论如何,感谢您的帮助:-)

您的示例在linux上对我很有用。也许可以尝试使用-d选项来查看出了什么问题?谢谢,@suvayu可能正在寻找一个名为“Makefile”的文件的隐式规则,我无法理解。我使用的是make 3.80。您定义的规则要求您使用命令“make.py”,其中是要生成的文件名。Make不会自动假定您要将所有ui文件转换为py文件。@ChristophJüngling我忽略了您刚才调用的
Make
。正如@kasterma所提到的,您必须用当前的Makefile键入
makefilename
。@suvayu。。。因为我没有指定一个目标,它将所有操作集中到这一点?好的,那么最好使用一个简单的shell脚本,就像eriktous写的那样。你的例子在linux上对我很有用。也许可以尝试使用-d选项来查看出了什么问题?谢谢,@suvayu可能正在寻找一个名为“Makefile”的文件的隐式规则,我无法理解。我使用的是make 3.80。您定义的规则要求您使用命令“make.py”,其中是要生成的文件名。Make不会自动假定您要将所有ui文件转换为py文件。@ChristophJüngling我忽略了您刚才调用的
Make
。正如@kasterma所提到的,您必须用当前的Makefile键入
makefilename
。@suvayu。。。因为我没有指定一个目标,它将所有操作集中到这一点?好的,那么最好使用一个简单的shell脚本,就像eriktous写的那样。现在我遇到了另一个错误:程序异常终止C:\Users\…\Temp\make9642.sh:fork失败:无错误[1]make:**[ui2py]error 1Hmmm,你真的信任你的硬件还是你的系统?因为,看起来问题不在于生成文件,而在于较低的级别。不,我不知道,这是Windows:-)我将在旧的XP机器上尝试此操作,在旧的XP机器上,更大的生成文件工作正常。这只是一个伪装的shell脚本。如果你这样做的话,几乎不需要使用make(这可能是操作的正确方式)。现在我遇到了另一个错误:程序异常终止C:\Users\…\Temp\make9642.sh:fork失败:无错误[1]make:**[ui2py]错误1Hmmm,你真的信任你的硬件或系统吗?因为,看起来问题不在于Makefile,而在于较低的级别。不,我不知道,这是Windows:-)我将在旧的XP机器上尝试这一点,那里有一个更大的