【发布时间】:2013-10-30 19:08:41
【问题描述】:
我尝试在安装期间使用自定义安装从 setup.py 调用 Python 脚本:
class CustomInstall(install):
def run(self):
install.run(self)
...
p = subprocess.Popen(
[sys.executable, 'demo_package/deploy_database.py'],
shell=True,
stdout=subprocess.PIPE,
cwd=os.path.join(self.install_lib, 'demo_package'))
out, err = p.communicate()
setup(..., cmdclass=dict(install=CustomInstall))
在 Ubuntu 机器上部署包时,该进程不会执行 deploy_database.py,而是显示任何内容。当我使用 Ctrl+C 手动停止它时,输出似乎表明它没有实际运行 deploy_database.py,而是简单地启动了 Python:
^CDownloading/unpacking PypiPackagesMonitoring
Downloading demo-1.0.64.zip
Running setup.py egg_info for package demo
Installing collected packages: demo
Running setup.py install for demo
Python 3.3.2+ (default, Oct 9 2013, 14:50:09)
[GCC 4.8.1 on linux
Type "help", "copyright", "credits" or "license" for more information.
Cleaning up...
Operation cancelled by the user
Storing complete log in /home/.../.pip/pip.log
我调用 Python 脚本的方式有什么问题?我应该怎么做呢?
【问题讨论】:
-
或者你可以使用
execfile。 -
shell=True应该暗示您需要一个不能表示为简单字符串序列的功能,即当使用shell=True时,您必须使用一个字符串来表示整个shell 命令*(它*不是简单地调用外部程序,而是包括一些shell 功能,例如管道/重定向/调用内置等)。否则,您应该使用shell=False,您可以用sys.argv的相同格式表示要执行的程序及其参数。混合这两种方法会导致这种奇怪的结果。
标签: python subprocess pip easy-install